文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
什么是ThreadLocal
ThreadLocal提供线程的局部变量,这种变量与普通变量的区别在于,每个访问这种变量的线程都有自己的、独立的变量副本。用于解决多线程间的数据隔离问题。
使用场景
其实ThreadLocal在很多开源框架中都有应用:
- Spring中的事务管理器,比如TransactionSynchronizationManager等。
- Mybatis中的ErrorContext类,使用ThreadLocal实现线程安全的单例。
- 存储session中的一些参数,比如用户信息等。
API
ThreadLocal提供了4个常用方法:
-
set()
方法,设置当前线程中变量的副本。 -
get()
方法,获取ThreadLocal
在当前线程中保存的变量副本。 -
remove()
方法,清空当前线程中变量的副本。 -
initialValue()
是一个protected
方法,一般是用来重写的,如果在没有set的时候就调用get
,会调用initialValue
方法初始化内容。
private static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>(){
//重写此方法,初始化ThreadLocal的value
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
原理
那么怎么实现数据隔离的,我们从源码的角度进行分析。
我们先看ThreadLocal类的get()方法。
public T get() {
Thread t = Thread.currentThread();
//通过当前线程获取ThreadLoca