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

相關文章
相關標籤/搜索