ThreadLocal

            刚学习完java,对如今这块还不是很了解.由于作的项目比较小,因此对Thread接触的不是不少,偶尔在网上看看相关资料,也没有去特地深入的了解,之前看篇文章说ThreadLocal是解决多线程共享数据的一个很好的方法,主要是对数据进行了共享,为每一个线程都建立了这个变量的副本,知道后来要用到相关Thread的知识,就去看了下源码,感受有点不对,就到网上又找了些资料看看,最后看这篇文章才感受之前理解都是错的 http://www.iteye.com/topic/103804.java

            ThreadLocal并非为每一个变量的副原本解决多线程共享数据的.而是数据共享并非ThreadLocal来管理的,而是经过ThreadLocalMap这个对象来管理的,每一个线程都有一个属于本身的ThreadLocalMap,当咱们想操做一个变量的时候,咱们要调用ThreadLocal.set()方法.咱们经过这段代码能够看出来多线程

  1.  public void set(T value) {  学习

  2.         Thread t = Thread.currentThread();  this

  3.         ThreadLocalMap map = getMap(t);  spa

  4.         if (map != null)  线程

  5.             map.set(this, value);  对象

  6.         else  get

  7.             createMap(t, value);  源码

  8.     }  it

  1.   ThreadLocalMap getMap(Thread t) {  

  2.         return t.threadLocals;  

  3.     }  

  1. void createMap(Thread t, T firstValue) {  

  2.         t.threadLocals = new ThreadLocalMap(this, firstValue);  

  3.     }  

            当咱们在多线程里面操做一个变量的时候,先取到当前线程,而后根据当前线程获取他的ThreadLocalMap对象,若是为null的话就new一个ThreadLocalMap并把ThreadLocal做为key,想赋值给这个变量的值做为value.而后当咱们获取这个变量的值的时候

  1.  public T get() {  

  2.         Thread t = Thread.currentThread();  

  3.         ThreadLocalMap map = getMap(t);  

  4.         if (map != null)  

  5.             return (T)map.get(this);  

  6.   

  7.         // Maps are constructed lazily.  if the map for this thread  

  8.         // doesn't exist, create it, with this ThreadLocal and its  

  9.         // initial value as its only entry.  

  10.         T value = initialValue();  

  11.         createMap(t, value);  

  12.         return value;  

  13.     }  

先获取当前线程,而后在获取这个线程的

            ThreadLocal只是做为一个key值ThreadLocalMap对象,在根据ThreadLocal获取这个变量的值.因此咱们在多线程里面操做一个成员变量的时候.咱们能够把这个成员变量让ThreadLocal来管理.

相关文章
相关标签/搜索