背景
尝试看Java源码,从TheadLocal开始,Java版本默认1.8。
用途
申明为:private static final
多线程中线程独立变量,不涉及线程间共享同步,多用于框架上下文中,减少参数传递
例:spring security中ThreadLocalSecurityContextHolderStrategy用于保存SecurityContext就使用了TheadLocal,在每次请求filter中set,在请求filter链结束后remove
源码
常用方法列表如下,具体代码看JDK
initialValue() 默认null,覆盖提供额外初始化
get() 获取值
remove() 移除值
set(T value)
原理
ThreadLocal提供操作一个线程局部变量的相关方法的一个类
具体变量值存于ThreadLocalMap的Entry Table[]中,key是ThreadLocal弱引用
ThreadLocalMap又由Thread持有
默认从CurrentThread中获取ThreadLocalMap
问题
-
为什么ThreadLocal不是工具类
ThreadLocal是实现类成员变量线程安全的一种技术,这样设计在使用很自然,很像简单成员变量
,ThreadLocal封装了实现线程安全的细节,范型又可以确保了值类型 -
神奇数字0x61c88647
hash碰撞避免和解决
具体查看【拓展-散列表】 -
内存泄露
在ThreadLocal的get,set的时候都会清除线程Map里所有key为null的value
ThreadLocal对象的回收,Thread到value的强引用还在
当Thread结束销毁后,强引用消失,value回收
但是在Thread一直存在的场景(如线程池),如果线程一直不销毁,不再使用此线程或不再使用此线程ThreadLocal的get,set的时候,则内存泄露,这种情况还是比较少见