ThreadLocal数据丢失困惑

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

情景一

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

情景二

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

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

阅读 4.8k
1 个回答
场景一

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

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

场景二:

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题