问答

ThreadLocal数据丢失困惑

作者:admin 2021-04-21 我要评论

ThreadLocal实现没有加锁,ThreadLocalMap的Entry key是弱引用的,这些不是会导致数据丢失吗,还是使用ThreadLoad场景要不在乎数据丢失。 情景一 当前线程设置了...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

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和线程绑定,不存在线程不安全的情况

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • ThreadLocal数据丢失困惑

    ThreadLocal数据丢失困惑

  • mysql 初始用户一定是root吗?

    mysql 初始用户一定是root吗?

  • springboot 2.0以后有什么较实用的新特

    springboot 2.0以后有什么较实用的新特

  • fiddler everywhere mac版抓不了包

    fiddler everywhere mac版抓不了包

腾讯云代理商
海外云服务器