关于多线程: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实例对象

  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() 到线程中的对象是该线程本人应用的对象,其余线程是不须要拜访的,也拜访不到的。当线程终止后,这些值会作为垃圾回收。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理