谈谈ThreadLocal

什么是ThreadLocal?

ThreadLocal实现每一个线程自己的专属本地变量,该变量是当前线程独有的变量。

ThreadLocal 可以在每个线程中创建一个独立的变量堆栈,使得每个线程中的变量都是相互独立的。这使得 ThreadLocal 可以被用于实现多线程的并发编程,例如在多线程的 Java 应用程序中,不同线程之间的变量不会互相干扰,从而提高了程序的性能和可靠性。

ThreadLocal 的实现基于 Java 的线程上下文(Thread Context),它可以在任何线程上下文中使用,并且可以方便地与现有的 Java 应用程序集成。ThreadLocal 提供了一系列方法来操作和获取线程上下文中的变量,使得程序员可以轻松地实现多线程的并发编程。

ThreadLocal底层?

ThreadLocal的底层是ThreadLocalMap,这个map并没有继承HashMap,而是自己实现了map的功能以及map中的键值对单元。

Thread,Threadlocal,ThreadLocalMap的关系
  • JAVA8之前,ThreadLocalMap作为ThreadLocal中的属性存在,Thread对象作为ThreadLocalMap中的key存在,也就是说在ThreadLocal对象的ThreadLocalMap对象中,有很多的Entry,每个Entry的key就是一个Thread线程对象,Entry的value就是线程变量的值。
  • JAVA8之后,ThreadLocalMap作为Thread的属性存在,ThreadLocal对象作为ThreadLocalMap中的key存在,也就是说,在一个Thread线程对象中,有很多的Entry,每个Entry的key就是一个ThreadLocal对象,而Entry的value也是线程变量的值。
  • 总结JAVA8之前和JAVA8之后,都是使用ThreadLocalMap中的value来存储实际的变量值,区别是JAVA8之前map是存放在ThreadLocal对象中,key是采用的Thread线程对象;而JAVA8之后map是归属在Thread中,key采用的是ThreadLocal对象。仿佛是做了一次行列转换。

ThreadLocal 内存泄露问题是怎么导致的?

ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,而 value 是强引用。所以,如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉。

这样一来,ThreadLocalMap 中就会出现 key 为 null 的 Entry。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。ThreadLocalMap 实现中已经考虑了这种情况,在调用 set()get()remove() 方法的时候,会清理掉 key 为 null 的记录。使用完 ThreadLocal方法后最好手动调用remove()方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值