ThreadLocal详解
前提
下文中所有的代码和贴图,都来源于JDK18,不是JDK1.8。
ThreadLocal、ThreadLocal、Thread的关系
Thread类中包含的与ThreadLocal相关的属性。
说明,每一个实例Thread中都有一个ThreadLocalMap,并且从ThreadLocal.ThreadLocalMap格式中,可知Thread Local Map是一个ThreadLocal的内部类。
再看看ThreadLocal和ThreadLocalMap的关系。
从红框字体可以得知,ThreadLocal类属性threadLocalHashCode是ThreadLocalMap的key值,每次生成一个ThreadLocal都会有一个新的threadLocalHashCode。
以下是ThreadLocal的get方法,可以主要作用是 获取Thread对应ThreadLocalMap对象,再从这个对象上获取对应的value值。如果不存在Map,那么会走set方法,set方法会对Thread新建一个ThreadLocalMap。
红框内的getMap方法:
总结
一个Thread对应的是一个ThreadLocalMap和一个inheritableThreadLocalMap,具体实现是作为Thread类中的属性。
而ThreadLocal类中的ThreadLocalHashCode是ThreadLocalMap的key值,这个key值在每次实例化ThreadLocal时会自动生成一个,并且是线程安全的。