标签:style http color java 数据 for ar 代码
刚学习完java,对现在这块还不是很了解.因为做的项目比较小,所以对Thread接触的不是很多,偶尔在网上看看相关资料,也没有去特意深刻的了解,以前看篇文章说ThreadLocal是解决多线程共享数据的一个很好的方法,主要是对数据进行了共享,为每个线程都创建了这个变量的副本,知道后来要用到相关Thread的知识,就去看了下源码,感觉有点不对,就到网上又找了些资料看看,最后看这篇文章才感觉以前理解都是错的 http://www.iteye.com/topic/103804.
ThreadLocal并不是为每个变量的副本来解决多线程共享数据的.而是数据共享并不是ThreadLocal来管理的,而是通过ThreadLocalMap这个对象来管理的,每个线程都有一个属于自己的ThreadLocalMap,当我们想操作一个变量的时候,我们要调用ThreadLocal.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);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
当我们在多线程里面操作一个变量的时候,先取到当前线程,然后根据当前线程获取他的ThreadLocalMap对象,如果为null的话就new一个ThreadLocalMap并把ThreadLocal作为key,想赋值给这个变量的值作为value.然后当我们获取这个变量的值的时候
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
return (T)map.get(this);
// Maps are constructed lazily. if the map for this thread
// doesn‘t exist, create it, with this ThreadLocal and its
// initial value as its only entry.
T value = initialValue();
createMap(t, value);
return value;
}
先获取当前线程,然后在获取这个线程的
ThreadLocal只是作为一个key值ThreadLocalMap对象,在根据ThreadLocal获取这个变量的值.所以我们在多线程里面操作一个成员变量的时候.我们可以把这个成员变量让ThreadLocal来管理.
标签:style http color java 数据 for ar 代码
原文地址:http://my.oschina.net/u/914362/blog/298044