今天看马士兵关于 ThreadLocal 以及4种引用的视频中说,ThreadLocal 中的 ThreadLocalMap 中保存的数据是原变量(我的理解是原变量的引用地址)不是原变量的副本。但是以前看过其他老师的视频介绍说是 ThreadLocal 中保存的是原变量的副本。不知道哪个说的对?如果像马士兵说的是原变量,那岂不是没有起到线程间隔离的效果?但实际使用 ThreadLocal 确实达到了线程间隔离的效果。这里很迷惑。
今天看马士兵关于 ThreadLocal 以及4种引用的视频中说,ThreadLocal 中的 ThreadLocalMap 中保存的数据是原变量(我的理解是原变量的引用地址)不是原变量的副本。但是以前看过其他老师的视频介绍说是 ThreadLocal 中保存的是原变量的副本。不知道哪个说的对?如果像马士兵说的是原变量,那岂不是没有起到线程间隔离的效果?但实际使用 ThreadLocal 确实达到了线程间隔离的效果。这里很迷惑。
先说结论:保存的数据是原变量的地址,不是副本
Thread类里有一个ThreadLocalMap类型的threadLocals对象,每个线程要保存的数据就放在它自己的threadLocals里,以此来达到线程隔离。
ThreadLocalMap实质上是一个Entry数组,每一个Entry的key就是我们使用的ThreadLocal对象,而value就是保存的数据
。示意图如下