ThreadLocal中保存的数据是变量的副本还是原变量?

今天看马士兵关于 ThreadLocal 以及4种引用的视频中说,ThreadLocal 中的 ThreadLocalMap 中保存的数据是原变量(我的理解是原变量的引用地址)不是原变量的副本。但是以前看过其他老师的视频介绍说是 ThreadLocal 中保存的是原变量的副本。不知道哪个说的对?如果像马士兵说的是原变量,那岂不是没有起到线程间隔离的效果?但实际使用 ThreadLocal 确实达到了线程间隔离的效果。这里很迷惑。

阅读 1.2k
1 个回答

先说结论:保存的数据是原变量的地址,不是副本

Thread类里有一个ThreadLocalMap类型的threadLocals对象,每个线程要保存的数据就放在它自己的threadLocals里,以此来达到线程隔离。ThreadLocalMap实质上是一个Entry数组,每一个Entry的key就是我们使用的ThreadLocal对象,而value就是保存的数据。示意图如下

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