ThreadLocal

原创
2014/08/05 10:52
阅读数 164

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

            ThreadLocal并不是为每个变量的副本来解决多线程共享数据的.而是数据共享并不是ThreadLocal来管理的,而是通过ThreadLocalMap这个对象来管理的,每个线程都有一个属于自己的ThreadLocalMap,当我们想操作一个变量的时候,我们要调用ThreadLocal.set()方法.我们通过这段代码可以看出来

  1.  public void set(T value) {  

  2.         Thread t = Thread.currentThread();  

  3.         ThreadLocalMap map = getMap(t);  

  4.         if (map != null)  

  5.             map.set(this, value);  

  6.         else  

  7.             createMap(t, value);  

  8.     }  

  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来管理.

展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部