ThreadLocal个人理解梳理

记录一下自己对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值

posted @ 2019-05-31 11:32  一天到晚想名字  阅读(271)  评论(0编辑  收藏  举报