ThreadLocal问题 当前线程中的ThreadLocalMap变量哪来的

如题所述

t.threadLocals 是当前线程Thread(t) 的成员变量, 当使用 ThreadLocal 创建对象后,调用 ThreadLocal.set()方法会看到初始化 ThreadLocalMap的过程,JDK内部实现代码截图如下:

(1)调用set方法,初始化 ThreadLocalMap 对象,如果getMap(t)获取当前线程 threadLocals 变量为空,随后创建一个;反之,直接使用存储线程数据.

(2)创建ThreadLocalMap 对象的方法实现,即为当前线程 threadLocals赋值.

追问

非常感谢回答,我还想问一下,threadLocals 是当前线程Thread 的成员变量,那为什么我new出来一个Thred对象,这个thread对象调用不了threadLocals这个变量呢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-10

ThreadLocal 是一个线程的本地变量,也就意味着这个变量是线程独有的,是不能与其他线程共享的,这样就可以避免资源竞争带来的多线程的问题,这种解决多线程的安全问题和lock(这里的lock 指通过synchronized 或者Lock 等实现的锁) 是有本质的区别的:

1. lock 的资源是多个线程共享的,所以访问的时候需要加锁。

2. ThreadLocal 是每个线程都有一个副本,是不需要加锁的。

3. lock 是通过时间换空间的做法。

4. ThreadLocal 是典型的通过空间换时间的做法。


当然他们的使用场景也是不同的,关键看你的资源是需要多线程之间共享的还是单线程内部共享的

详情请看网页链接

相似回答