首页 > 其他 > 详细

ThreadLocal

时间:2020-05-13 19:28:18      阅读:45      评论:0      收藏:0      [点我收藏+]

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

调用链如下:

技术分享图片

 

 技术分享图片

 

ThreadLocal

原文:https://www.cnblogs.com/fanBlog/p/11858880.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!