码迷,mamicode.com
首页 > 其他好文 > 详细

ThreadLocal个人理解梳理

时间:2019-05-31 11:47:29      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:图片   turn   设计   否则   open   有关   hid   实战   class   

记录一下自己对ThreadLocal的理解。

看了《实战java高并发程序设计》的书,里面有关于ThreadLocal的讲解,里面提到了ThreadLocal,ThreadLocalMap,threadlocals,entry等,看了半天没明白。

一个ThreadLocal在多线程中是如何存储的?

如果代码中定义了多个ThreadLocal,又是如何存储的?

先看下比较重要的set和get方法

技术图片
#set
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

#get
public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }
View Code

先解释定义一个ThreadLocal的存储

每一个线程进来后,使用set方法,用线程作为key去查threadlocals(这是个变量,类型就是ThreadLocalMap)中是不是有值(这个值,就是一个entry类型),如果有entry,就将entry.value设置成新值,否则就创建一个entry。这里针对只有一个ThreadLocal变量的时候,创建一个entry其实也是创建一个threadlocals。所以最后每个线程中都有一个自己的threadlocals,里面存的就是自己要设置的值。

那多个ThreadLocal变量呢?

其实这里重要的就是entry了,ThreadLocalMap中其实有一组entry,而entry其实也是类似map的结构,map的key就是ThreadLocal的变量名,value就是真实要设置的值。这样就可以保证了在每个线程中,threadlocals保存了不同的ThreadLocal变量的value值

ThreadLocal个人理解梳理

标签:图片   turn   设计   否则   open   有关   hid   实战   class   

原文地址:https://www.cnblogs.com/tianphone/p/10954356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!