zoukankan      html  css  js  c++  java
  • ThreadLocal

    ThreadLocal:每个线程可以保存自己的变量,多个线程互不影响,副本,线程独享

    set:以当前线程为Key 保存在ThreadLocalMap

        public void set(T value) {
      //获取到当前执行这段代码的Thread对象 Thread t
    = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }

     public static native Thread currentThread();

    Thread类中有一个ThreadLocalMap threadLocals。ThreadLocalMap是一个类似HashMap的存储结构,那么它的key和value分别是什么呢?

    //Thread类  
    /* ThreadLocal values pertaining to this thread. This map is maintained
         * by the ThreadLocal class. */
        ThreadLocal.ThreadLocalMap threadLocals = null;

    如下,key是一个ThreadLocal对象,value是我们要存储的变量副本

    //key是一个ThreadLocal对象,value是我们要存储的变量副本  
    
    static class Entry extends WeakReference<ThreadLocal<?>> {
                /** The value associated with this ThreadLocal. */
                Object value;
    
                Entry(ThreadLocal<?> k, Object v) {
                    super(k);
                    value = v;
                }
            }

    至此,一切都明了了。

    • ThreadLocal对象通过Thread.currentThread()获取当前Thread对象

    • 当前Thread获取对象内部持有的ThreadLocalMap容器

    • 从ThreadLocalMap容器中用ThreadLocal对象作为key,操作当前Thread中的变量副本。

    调用链如下:

     

  • 相关阅读:
    [Luogu] 封锁阳光大学
    [other] Div
    [USACO11DEC] 牧草种植Grass Planting
    [Luogu] 仓鼠找sugar
    [USACO15DEC]最大流Max Flow
    [noip-2013] 货车运输
    [模板] 普通平衡树
    [Luogu] 树链剖分
    [ZJOI2008] 树的统计Count
    大组合数取模
  • 原文地址:https://www.cnblogs.com/fanBlog/p/11858880.html
Copyright © 2011-2022 走看看