说一下ThreadLocalMap中的get流程
时间: 2023-08-11 08:00:56 浏览: 90
ThreadLocalMap是ThreadLocal类的一个静态内部类,它用于存储每个线程的ThreadLocal变量副本。在ThreadLocalMap中,通过ThreadLocal对象作为key来获取和设置对应的变量副本。
下面是ThreadLocalMap中get方法的流程:
1. 首先,通过当前线程的`Thread.currentThread()`方法获取当前线程对象。
2. 然后,从线程对象中获取ThreadLocalMap对象,即通过`thread.threadLocals`获取。
3. 如果ThreadLocalMap对象为null,表示当前线程还没有创建ThreadLocalMap对象。这时,会调用`createMap()`方法创建一个新的ThreadLocalMap对象,并将其设置到当前线程的threadLocals属性中。
4. 如果ThreadLocalMap对象不为null,就通过ThreadLocal对象作为key来获取对应的变量副本。具体的操作是通过调用`getEntry(ThreadLocal<?> key)`方法。
5. 在`getEntry(ThreadLocal<?> key)`方法中,首先根据ThreadLocal对象的哈希值计算出在Entry数组中的索引位置。然后,从该索引位置开始遍历Entry数组,比较每个Entry的key与传入的ThreadLocal对象是否相等。如果找到匹配的Entry,就返回其对应的值;如果找不到匹配的Entry,则返回null。
6. 如果找到匹配的Entry,并且该Entry的值为null,表示当前线程还没有设置过该ThreadLocal对象的变量副本。这时,会调用`createValue(ThreadLocal<?> key)`方法创建一个新的变量副本,并将其设置到Entry的value中。
7. 最后,返回获取到的变量副本。
总结起来,ThreadLocalMap的get方法主要是通过当前线程和ThreadLocal对象来获取对应的变量副本。如果该变量副本还没有被创建,则会调用相应的方法来创建并设置。
阅读全文