文章已收录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();
//通过当前线程获取ThreadLocalMap<

本文详细解析了ThreadLocal的工作原理,包括其如何实现线程间数据隔离,使用场景如Spring事务管理、Mybatis ErrorContext,以及其API的介绍。通过源码分析,揭示ThreadLocalMap的数据结构和内存管理,特别讨论了弱引用避免内存泄漏的机制,并提醒开发者在不再使用ThreadLocal时调用remove()来防止内存问题。
最低0.47元/天 解锁文章
248

被折叠的 条评论
为什么被折叠?



