ThreadLocal原理和实现线程安全数据共享

2019-06-01  本文已影响0人  搞好关系

怎么分析呢?我们就直接先以get数据入手吧

public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

从此处我们可以简单看出是采用类似Map的方式,采用Key-Value方式实现数据的存储的,而Key则是当前的线程
我们来看一下setInitialValue

 private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

map.set(this, value)中我们看出的确是采用Map存储方式,
接着我们看一下怎么创建的Map

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

至此我们看到内部采用的是一个ThreadLocalMap作为数据存储容器,Thread作为Key来实现数据的共享存储,从而实现当前数据多线程共享(至于ThreadLocalMap内部我们不去深究)

上一篇下一篇

猜你喜欢

热点阅读