ThreadLocal实现没有加锁,ThreadLocalMap的Entry key是弱引用的,这些不是会导致数据丢失吗,还是使用ThreadLoad场景要不在乎数据丢失。
情景一
当前线程设置了ThreadLocal,还未运行到获取值得地方,发生GC,key被清除,到获取值得地方,不就获取不到值了吗
情景二
两个线程同时设置ThreadLocal,hash一样,hash到的entry是空的,直接赋值,由于原子性问题,两个都赋值到同一个entry,值覆盖与预期不一样
网上搜了半天,找不到有说这两个的文章
场景一
弱引用的对象会在“没有直接引用之后被GC掉”不是“会被GC掉(这种是软引用)”,
ThreadLocal
用弱引用是为了防止用完了不调用remove
造成的内存泄漏,对正常使用没有影响。这里多解释一下,
ThreadLocal
的原理是Thread
里有一个ThreadLocal -> value
的ThreadLocalMap
,如果业务代码已经用完了ThreadLocal
但是没有调用remove
而且Thread
一直存在,这个ThreadLocal
和对应的数据就一直有引用,会一直无法释放。所以这里使用了
WeakReference
,如果外面已经没有对这个ThreadLocal
的直接引用,就会在GC的时候释放掉它场景二:
ThreadLocal和线程绑定,不存在线程不安全的情况