写点什么

ThreadLocal

作者:红袖添香
  • 2023-08-08
    北京
  • 本文字数:768 字

    阅读完需:约 3 分钟

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://javaguide.cn/java/concurrent/java-concurrent-questions-02.html#threadlocal-%E7%A4%BA%E4%BE%8B


详细描述参见:

https://blog.csdn.net/ldy007714/article/details/130343007


扩容机制:

https://css.dandelioncloud.cn/article/details/1567358951329329153


发布于: 20 小时前阅读数: 17
用户头像

红袖添香

关注

大雨落幽燕,白浪滔天 2018-08-10 加入

还未添加个人简介

评论

发布
暂无评论
ThreadLocal_Java_红袖添香_InfoQ写作社区