t.threadLocals 是当前线程Thread(t) 的成员变量, 当使用 ThreadLocal 创建对象后,调用 ThreadLocal.set()方法会看到初始化 ThreadLocalMap的过程,JDK内部实现代码截图如下:
(1)调用set方法,初始化 ThreadLocalMap 对象,如果getMap(t)获取当前线程 threadLocals 变量为空,随后创建一个;反之,直接使用存储线程数据.
(2)创建ThreadLocalMap 对象的方法实现,即为当前线程 threadLocals赋值.
追问非常感谢回答,我还想问一下,threadLocals 是当前线程Thread 的成员变量,那为什么我new出来一个Thred对象,这个thread对象调用不了threadLocals这个变量呢
ThreadLocal 是一个线程的本地变量,也就意味着这个变量是线程独有的,是不能与其他线程共享的,这样就可以避免资源竞争带来的多线程的问题,这种解决多线程的安全问题和lock(这里的lock 指通过synchronized 或者Lock 等实现的锁) 是有本质的区别的:
1. lock 的资源是多个线程共享的,所以访问的时候需要加锁。
2. ThreadLocal 是每个线程都有一个副本,是不需要加锁的。
3. lock 是通过时间换空间的做法。
4. ThreadLocal 是典型的通过空间换时间的做法。
当然他们的使用场景也是不同的,关键看你的资源是需要多线程之间共享的还是单线程内部共享的
详情请看网页链接