【多线程和并发】ThreadLocal

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Soldier49Zed/article/details/101429219

ThreadLocal相当于一个容器,用于存放每个线程的局部变量。ThreadLocal实例通常来说都是private static类型的。ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。

一般情况下,通过ThreadLocal.set()到线程中的对象是该线程自己使用的对象,其他线程是访问不到的,各个线程中访问的是不同的对象。如果ThreadLocal.set()对象的set(Object o)时,该方法则通过Thread.currentThread()获取当前线程,将变量存入线程中的ThreadLocalMap类的对象内,Map中元素的键为当前的ThreadLocal对象,而值对应线程的变量副本。

public T get() {
        //每个Thread对象内都保存一个ThreadLocalMap对象
        Thread t = Thread.currentThread();
        //map中元素的键为共用的ThreadLocal对象,而值为对应线程的变量副本。
        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();
}

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

ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
}

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

猜你喜欢

转载自blog.csdn.net/Soldier49Zed/article/details/101429219
今日推荐