刚学习完java,对如今这块还不是很了解.由于作的项目比较小,因此对Thread接触的不是不少,偶尔在网上看看相关资料,也没有去特地深入的了解,之前看篇文章说ThreadLocal是解决多线程共享数据的一个很好的方法,主要是对数据进行了共享,为每一个线程都建立了这个变量的副本,知道后来要用到相关Thread的知识,就去看了下源码,感受有点不对,就到网上又找了些资料看看,最后看这篇文章才感受之前理解都是错的 http://www.iteye.com/topic/103804.java
ThreadLocal并非为每一个变量的副原本解决多线程共享数据的.而是数据共享并非ThreadLocal来管理的,而是经过ThreadLocalMap这个对象来管理的,每一个线程都有一个属于本身的ThreadLocalMap,当咱们想操做一个变量的时候,咱们要调用ThreadLocal.set()方法.咱们经过这段代码能够看出来多线程
public void set(T value) { 学习
Thread t = Thread.currentThread(); this
ThreadLocalMap map = getMap(t); spa
if (map != null) 线程
map.set(this, value); 对象
else get
createMap(t, value); 源码
} it
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来管理.