ThreadLocal的原理與使用

經過源碼解讀ThreadLocal類的實現this

 

ThreadLocal類提供瞭如下幾個方法spa

 

  1. get()方法是用來獲取ThreadLocal在當前線程中保存的變量副本
  2. set()用來設置當前線程中變量的副本
  3. remove()用來移除當前線程中變量的副本
  4. initialValue()是一個protected方法,通常是用來在使用時進行重寫的,它是一個延遲加載方法

首先咱們來看一下ThreadLocal是如何爲每一個線程建立一個變量副本的:線程

     第160行,獲取當前線程對象實例對象

   第161行,經過當前線程對象實例獲取一個ThreadLocalMap,這個map是ThreadLocal類的一個內部靜態類,blog

   若是map不爲空接着獲取map中的entry,繼承

這裏獲取鍵值對傳進去的是  this,而不是當前線程trem

   若是獲取成功,則返回valueget

   若是map爲空,則調用setInitialValue方法返回value源碼

   咱們上面的每一句來仔細分析:it

    首先看一下getMap方法中作了什麼?

  

getMap中,是調用當期線程t,返回當前線程t中的一個成員變量threadLocals

那麼咱們繼續取Thread類中取看一下成員變量threadLocals是什麼:

實際上就是一個ThreadLocalMap,這個類型是ThreadLocal類的一個內部類,咱們繼續取看ThreadLocalMap的實現:

 

能夠看到ThreadLocalMapEntry繼承了WeakReference,而且使用ThreadLocal做爲鍵值。

而後再繼續看setInitialValue方法的具體實現:

很容易瞭解,就是若是map不爲空,就設置鍵值對,爲空,再建立Map,看一下createMap的實現:

以上源碼就能夠看出:

首先在每一個線程Thread內部有一個ThreadLocal.ThreadLocalMap類型的成員變量threadLocals,這個threadLocals就是用來存儲實際變量副本的,鍵值爲當前ThreadLocal變量,value爲變量副本(即T類型的變量)。

初始時,在Thread裏面,threadLocals爲空,當經過ThreadLocal變量調用get()方法或者set()方法,就會對Thread類中的threadLocals進行初始化,而且以當前ThreadLocal變量爲鍵值,以ThreadLocal要保存的副本變量爲value,存到threadLocals。

相關文章
相關標籤/搜索