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

ThreadLocal

时间:2019-01-25 18:52:15      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:如何   机制   ESS   entry   syn   拷贝   源代码   成员变量   als   

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?

  每个线程中都有一个独立的ThreadLocalMap,它所存储的值,只能被当前线程读取和修改

源代码:

 

public void set(T value) {
        Thread t = Thread.currentThread();  //拿到当前线程
        ThreadLocalMap map = getMap(t);     //拿到当前线程里的ThreadLocalMap
        if (map != null)
            map.set(this, value);           //键值为当前ThreadLocal对象,值为要维护的变量
        else
            createMap(t, value);
    }

 

getMap(t)是怎么来的呢? 源码 : 
 ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

 

t.threadLocals是啥?
参见Thread类: 原来Thread类有个threadLocals成员变量
 /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

ThreadLocal.ThreadLocalMap是啥? 原来ThreadLocal有个静态内部类
 static class ThreadLocalMap

 

 
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();
    }

 

ThreadLocal和传统的synchronized有啥区别?

synchronized是锁机制进行时间换空间,ThreadLocal是存储拷贝进行空间换时间。

ThreadLocal

标签:如何   机制   ESS   entry   syn   拷贝   源代码   成员变量   als   

原文地址:https://www.cnblogs.com/yintingting/p/10320929.html

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