ThreadLocal和InheritableThreadLocal解析

一、兩者區別:

    ThreadLocal:爲每一個線程創建一個副本,每個副本線程隔離。但是他不支持繼承。

    InheritableThreadLocal:支持繼承。這裏的繼承不是extends,是指線程的繼承。也就是說新起一個線程可以擁有老線程的數據。


二、原理:

    這裏要先說另一個概念ThreadLocalMap。他和普通map差不多,也是key-value結構,key爲threadlocal對象,value爲你設置的值。爲什麼這裏要用map,因爲可能有多個ThreadLocal對象。所以這個map可以理解爲倉庫,存儲數據的倉庫。

    在Thread類我們可以看到如下分別創建2個 ThreadLocalMap對象。用來存儲數據。


    繼續追蹤,查找它是什麼時候被賦值的(分爲ThreadLocal實現和InheritableThreadLocal實現)。

    ThreadLocal:在ThreadLocal類的set方法,它調用當前線程獲取ThreadLocalMap,如果沒有就new一個

 

    InheritableThreadLocal:重寫了getMap和createMap兩個方法。    


    OK,我們知道是怎麼賦值的,那麼InheritableThreadLocal是怎麼做到繼承(值傳遞)的呢?

    在Thread的init方法裏我們看到如下的賦值語句:


    在初始化時候獲取當前線程的inheritableThreadLocals(這是新線程的初始化,但是currentThread獲取的還是老線程),把它賦值到新線程的屬性裏去,這樣新線程就有值了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章