ThreadLocal的错误理解纠正

来源:互联网 发布:北航软件工程硕士学费 编辑:程序博客网 时间:2022/08/11 17:41

目前网络上有很多关于Java中 ThreadLocal类原理的讲解,但是发现解读源码真正对的是比较少的,有很多人都错误的理解为:ThreadLocal之所以可以使每一个线程都有自己的变量副本,是由于它封装了一个Map集合,以每一个线程对象为key,变量副本为value来保存数据。


其实ThreadLocal对象并没有自己维护一个Map集合来保存每一个线程的变量副本,而是每一个线程本身维护了一个ThreadLocalMap集合来保存自己的数据, ThreadLocal 的get方法和set方法操作的都是当前线程自己的ThreadLocalMap,每一个线程的ThreadLocalMap集合,会用这个ThreadLocal对象作为为key,自己的数据副本作为value。

总之:1、ThreadLocal对象将作为每一个Thread对象中的ThreadLocalMap的key,

           一般我们会将ThreadLocal定义为static的,因为每一个线程可以共用这个key。

           2、ThreadLocal的get和set方法操作的都是每一个“当前线程”的ThreadLocalMap。

           3、ThreadLocal中的getMap()方法是为了得到每一个“当前线程”自己的ThreadLocalMap。

           4、ThreadLocal中的createMap()方法是为了给每一个“当前线程”自己的ThreadLocalMap赋值。

           5、ThreadLocal中的initialValue()方法是为了方便用户重写,便于执行get方法的时候为

           每一个“当前线程”中的数据副本赋值,否则默认会为null。

0 0