这篇文章主要介绍了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