一、兩者區別:
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獲取的還是老線程),把它賦值到新線程的屬性裏去,這樣新線程就有值了。