ThreadLocal笔记

114 阅读1分钟

一、使用

val threadLocal = ThreadLocal<String>()
threadLocal.set("Hello,World");
val str = threadLocal.get()

二、作用:

为每个线程提供独享空间,以保存线程独享资源

三、原理:

  • 每个线程Thread中有1个threadLocalsThreadLocalMap)变量
  1. ThreadLocalMap的键Key = 当前ThreadLocal实例,值value = 该线程设置的存储在ThreadLocal变量的值
  2. keyThreadLocal对象的弱引用;当要抛弃掉ThreadLocal对象时,垃圾收集器会忽略该 key的引用而清理掉ThreadLocal对象

四、ThreadLocalMap

ThreadLocalMap 数据结构解析

哈希表特性

特性ThreadLocalMap说明
初始容量162的幂次方
哈希函数key.hashCode() & (len-1)标准取模运算
冲突解决开放地址法(线性探测)无链表结构
填充因子2/3 (约66.7%)比HashMap的0.75更早扩容
Key引用类型弱引用利于GC回收
Value引用类型强引用需要主动清理避免内存泄漏

碰撞处理机制(线性探测法)

  1. 使用线性探测法处理hash冲突:int nextIndex = i + 1 < len ? i + 1 : 0,即如果发生了冲突则循环选取下一个槽位存放,如果是最后一位发生冲突则选取第一位。
  2. 默认tab长度为16,扩容因子为2/3,threshold默认为16 * 2/3 = 10,size >= threshold触发清理检查,size >= threshold * 3/4 =8触发实际扩容。每次扩容为原来tab长度的2倍。