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

    调用链如下:

     

  • 相关阅读:
    api.js
    vue开关
    vue 单选框自定义
    vue 笔记
    Flutter 检测网络连接 监听网络变化
    lutter 调用原生硬件 Api 实现扫码
    flutter 支付宝支付流程以及用 Flutter 在 Android Ios 中实现支付宝支付
    js+css 动效+1的效果
    Vue -- filters 过滤器、倒计时效果
    移动端如何实现两行点点点?
  • 原文地址:https://www.cnblogs.com/fanBlog/p/11858880.html
Copyright © 2011-2022 走看看