Java中的ThreadLocal有什么用

  

这篇文章主要介绍了Java中的ThreadLocal有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

除了使用synchronized同步符号外,Java中的ThreadLocal是另一种实现线程安全的方法。在进行性能测试用例的编写过程中,比较简单的办法就是直接使用synchronized关键字,修饰对象、方法以及类。但是使用synchronized同步,这可能会影响应用程序的可伸缩性以及运行效率。但是如果要在多个线程之间共享对象又要保障线程安全,则除了synchronized之外没有特别适合测试的方法。

Java中的ThreadLocal是实现线程安全的另一种方法,它不满足同步要求,而是通过为每个线程提供Object的显式副本来消除共享。由于不再共享对象,因此不需要同步,它可以提高应用程序的可伸缩性和运行效率。

ThreadLocal简介

很多人几乎都没有用过ThreadLocal类,因为在测试中能用到的地方实在太少了,而且测试脚本的性能一般来讲都会很高,远超被测服务的处理能力,所以即使全部使用synchronized也不会有任何问题。

但是ThreadLocal有很多真正的使用场景,这就是为什么将其添加到标准Java平台库中的原因。尽管知道现在多线程编程测试中对于ThreadLocal应用并不多,但是我会在后期多进行一些实践,分享给各位。

以下是Java中ThreadLocal类的一些众所周知的用法:

  • ThreadLocal非常适合实现每个线程单例类或每个线程上下文信息(例如事务ID)。

  • 可以将任何非线程对象包装在ThreadLocal中,并且将其使用变为线程安全的。ThreadLocal的经典示例之一是共享SimpleDateFormat。由于SimpleDateFormat不是线程安全的,因此使用全局格式化程序可能无法正常工作,但是使用每个线程格式化程序当然可以工作。

  • ThreadLocal提供了另一种扩展Thread的方法。如果要保留信息或将信息从一个方法调用传递到另一个方法,则可以使用ThreadLocal进行传递。

  • 由于不需要修改任何方法,因此可以提供极大的灵活性。

没有两个线程可以看到彼此的ThreadLocal变量。J2EE应用程序服务器中有一个ThreadLocal的真实示例,该服务器使用Java ThreadLocal变量来跟踪事务和安全上下文。

为了避免过多的创建和共享全局实例时的切换成本,将诸如数据库连接之类的重对象作为ThreadLocal共享是很有意义的。

ThreadLocal演示Demo

package com.fun.ztest.java;
  
  import  com.fun.frame.SourceCode;
  import  org.slf4j.Logger;
  import  org.slf4j.LoggerFactory;
  
  import  java.io.IOException;/* *
  ,* ThreadLocal演示测试类
  ,*/public  class  FunTester  extends  SourceCode  {
  
  public 才能static  Logger  Logger =, LoggerFactory.getLogger (FunTester.class);
  
  ,/* *
  ,,*,这个是重点,通过ThreadLocal类重建线程私有的对象
  ,,*/private 才能static  final  ThreadLocal, format =, new  ThreadLocal (), {
  
  ,,@Override
  ,,,protected  Object  initialValue (), {
  ,,,,,Object  funTester =, new 对象();
  ,,,,,logger.info(“初始化对象,线程:,{},对象:,{},,,Thread.currentThread () . getname (),, funTester.hashCode ());
  ,,,,,return  funTester;
  ,,,}
  ,,};
  
  public 才能;static  void 主要(String 参数[]),throws  IOException, InterruptedException  {
  ,,,for  (int 小姐:=,0;,小姐:& lt;, 5;,我+ +),{
  ,,,,,Thread  t =, new 线程(new 有趣的());
  ,,,,,t.start ();
  ,,,}
  ,,}
  
  ,/* *
  ,,*,获取对象
  ,,*
  ,,* @return
  ,,*/public 才能;static  Object 得到(),{
  ,,,return  format.get ();
  ,,}
  
  
  static 才能class  Fun  implements  Runnable  {
  
  ,,@Override
  ,,,public  void 运行(),{
  ,,,,,logger.info(“线程:,{},对象:,{},,,Thread.currentThread () . getname (),, FunTester.get () .hashCode ());
  ,,,}
  
  
  ,,}
  
  
  }

Java中的ThreadLocal有什么用

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5