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
ThreadLocal提供操作一个线程局部变量的相关方法的一个类

具体变量值存于ThreadLocalMap的Entry Table[]中,key是ThreadLocal弱引用

ThreadLocalMap又由Thread持有

默认从CurrentThread中获取ThreadLocalMap

神奇数字0x61c88647

hash碰撞避免和解决
具体查看【拓展-散列表】

内存泄露

ThreadLocal对象的回收,Thread到value的引用还在,
当Thread结束时,引用消失,value回收
但是在Thread一直存在的场景(如线程池),导致value无法回收,内存泄露
查看【拓展-ThreadLocalMap】

问题

1、为什么ThreadLocal不是工具类
我理解:ThreadLocal是实现类成员变量线程安全的一种技术,这样设计在使用很自然,很像简单成员变量
,ThreadLocal封装了实现线程安全的细节,范型又可以确保了值类型

拓展

参考

  1. (基础系列)ThreadLocal的用法、原理和用途
  2. ThreadLocal 和神奇的数字 0x61c88647