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中的变量副本。

    调用链如下:

     

  • 相关阅读:
    Ant构建原理及build.xml文档描述
    Selenium WebDriver的工作原理
    appium工作原理
    jmeter获取mysql数据并作为请求参数使用
    linux sar的使用
    hdu 1520 Anniversary party
    hdu 1331 Function Run Fun
    hdu 1208 Pascal's Travels
    hdu 1159 Common Subsequence
    poj 1129 Channel Allocation
  • 原文地址:https://www.cnblogs.com/fanBlog/p/11858880.html
Copyright © 2011-2022 走看看