ThreadLocal
背景
尝试看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
神奇数字0x61c88647
hash碰撞避免和解决
具体查看【拓展-散列表】
内存泄露
ThreadLocal对象的回收,Thread到value的引用还在,
当Thread结束时,引用消失,value回收
但是在Thread一直存在的场景(如线程池),导致value无法回收,内存泄露
查看【拓展-ThreadLocalMap】
问题
1、为什么ThreadLocal不是工具类
我理解:ThreadLocal是实现类成员变量线程安全的一种技术,这样设计在使用很自然,很像简单成员变量
,ThreadLocal封装了实现线程安全的细节,范型又可以确保了值类型