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