ThreadLocal 实现原理、为什么key是弱引用

如何实现线程资源隔离的(实现原理)?

  1. 每个 Thread 对象都有一个 ThreadLocalMap 成员变量,这个Map使用一个Entry数组用来存储key,也就是hreadLocal对象本身,value为ThreadLocal#set方法中要设置的值,这个Entry继承了WeakReference弱引用

  2. Thread的内部的ThreadLocalMap 有ThreadLocal来维护,每次获取和设置值时,ThreadLocalMap都会调用Thread.currentThread获取当前线程,然后从当前线程中获取ThreadLocalMap,最后从ThreadLocalMap 中获取或者设置值。所以,对于不同的线程,每次获取的值都是自己线程的ThreadLocalMap 中的值,形成了线程隔离

为什么key 的引用为弱引用?

  1. 如果主线程调用了线程a,线程a中第一次使用ThreadLocal对象的的set方法后,线程a内部的ThreadLocalMap中就多了个key,这个key就是ThreadLocal对象本身,这个时候到达ThreadLocal对象就有2个可达路径

    1. 一条为:从主线程-->线程a对象-->ThreadLocal对象

    2. 另外一条为:从线程a-->线程a的ThreadLocalMap对象-->ThreadLocalMap的key

  2. 如果key为强引用,那么当线程a不再使用ThreadLocal时,第一条的可达性路径就会断开,会被GC回收,是没有问题的;第二条路径是不会断开的而且key是强引用,所以这个键值对不会被GC回收,会造成内存泄露;

  3. 如果key为弱引用,那么第二条虽然不会断开,但是由于key是弱引用,所以会被GC回收,不会造成内存泄露

为什么value不设置为强引用?

如果value设置为弱引用,容易被GC回收掉,无法获取到value

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值