ThreadLocal

ThreadLocal

二、工作流程

参考: https://www.cnblogs.com/xzwbl...
  1. Thread类中有一个成员变量属于ThreadLocalMap类(一个定义在ThreadLocal类中的内部类),它是一个Map,他的key是ThreadLocal实例对象。

    // ThreadLocal.class
    // ThreadLocal values pertaining to this thread. This map is maintained 
    // ThreadLocalMap 是一个定制化的 HashMap
    ThreadLocal.ThreadLocalMap threadLocals = null;

    key是ThreadLocal实例对象

    ThreadLocal_第1张图片

    ThreadLocal_第2张图片

  2. 当为ThreadLocal类的对象set值时,首先获得当前线程的ThreadLocalMap类属性,然后以ThreadLocal类的对象为key,设定value。get值时则类似。没有则直接创建新的ThreadLocalMap赋值给threadLocals

    ThreadLocalMap getMap(Thread t) {
      return t.threadLocals;
    }
    
    void createMap(Thread t, T firstValue) {
      t.threadLocals = new ThreadLocalMap(this, firstValue);
    }
  3. ThreadLocal变量的活动范围为某线程,是该线程“专有的,独自霸占”的,对该变量的所有操作均由该线程完成!也就是说,ThreadLocal 不是用来解决共享对象的多线程访问的竞争问题的,因为ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。当线程终止后,这些值会作为垃圾回收。

你可能感兴趣的:(多线程)