ThreadLocal数据丢失困惑

ThreadLocal实现没有加锁,ThreadLocalMap的Entry key是弱引用的,这些不是会导致数据丢失吗,还是使用ThreadLoad场景要不在乎数据丢失。

情景一

当前线程设置了ThreadLocal,还未运行到获取值得地方,发生GC,key被清除,到获取值得地方,不就获取不到值了吗

情景二

两个线程同时设置ThreadLocal,hash一样,hash到的entry是空的,直接赋值,由于原子性问题,两个都赋值到同一个entry,值覆盖与预期不一样

网上搜了半天,找不到有说这两个的文章

最佳答案

场景一

弱引用的对象会在“没有直接引用之后被GC掉”不是“会被GC掉(这种是软引用)”,ThreadLocal用弱引用是为了防止用完了不调用remove造成的内存泄漏,对正常使用没有影响。

这里多解释一下,ThreadLocal的原理是Thread里有一个ThreadLocal -> valueThreadLocalMap,如果业务代码已经用完了ThreadLocal但是没有调用remove而且Thread一直存在,这个ThreadLocal和对应的数据就一直有引用,会一直无法释放。
所以这里使用了WeakReference,如果外面已经没有对这个ThreadLocal的直接引用,就会在GC的时候释放掉它

场景二:

ThreadLocal和线程绑定,不存在线程不安全的情况