ThreadLocal
ThreadLocal 很容易让人望文生义,想当然地认为是一个 “本地线程”。其实,ThreadLocal 并不是一个 Thread,而是 Thread 的局部变量,也许把它命名为 ThreadLocalVariable 更容易让人理解一些。
ThreadLocal 内存泄露问题 ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,而 value 是强引用。所以,如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉。这样一来,ThreadLocalMap 中就会出现 key 为 null 的 Entry。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。ThreadLocalMap 实现中已经考虑了这种情况,在调用 set ()、get ()、remove () 方法的时候,会清理掉 key 为 null 的记录。使用完 ThreadLocal 方法后 最好手动调用 remove () 方法
ThreadLocal 的内部结构
在 JDK1.8 中,ThreadLocal 的设计方式是,每一个 Thread 维护一个 ThreadLocalMap,这个 Map 的 key 是 ThreadLocal 本身,value 是要存储的值。
具体的过程:
1. 每一个 thread 线程内部都有一个 Map(ThreadLocalMap)
2. Map 里面存储 ThreadLocal 对象(Key)和线程变量的副本(value)
3. Thread 内部的 Map 是由 ThreadLocal 维护的,由 ThreadLocal 负责向 Map 获取和设置线程的变量
4. 对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离这么设计的好处是每个 Map 存储的 Entry 数量变少,2. 当 Thread 销毁的时候 ThreadLocalMap 也会跟着销毁,减少内存使用
详细描述参见:
https://blog.csdn.net/ldy007714/article/details/130343007
扩容机制:
https://css.dandelioncloud.cn/article/details/1567358951329329153
版权声明: 本文为 InfoQ 作者【红袖添香】的原创文章。
原文链接:【http://xie.infoq.cn/article/751f8f1860fc10b9bce27adbe】。文章转载请联系作者。
评论