本文參考了:https://www.zhihu.com/question/35250439
理由:
爲了避免重複創建TSO(thread specific object,即與線程相關的變量。)
需要注意的是:無法解決共享對象的更新問題。(引用於《阿里巴巴JAVA開發規範》)我的理解是,static定義的類變量本來是可以進行變量共享的,但是因爲ThreadLocal根除了對變量的共享,所以static Thread< xxx> object無法實現類的共享和同步更新。
分析
我們知道,一個ThreadLocal實例對應當前線程中的一個TSO實例。因此,如果把ThreadLocal聲明爲某個類的實例變量(而不是靜態變量),那麼每創建一個該類的實例就會導致一個新的TSO實例被創建。顯然,這些被創建的TSO實例是同一個類的實例。於是,同一個線程可能會訪問到同一個TSO(指類)的不同實例,這即便不會導致錯誤,也會導致浪費(重複創建等同的對象)!因此,一般我們將ThreadLocal使用static修飾即可。
由於ThreadLocal是某個類的一個靜態變量。因此,只要相應的類沒有被垃圾回收掉,那麼這個類就會持有對相應ThreadLocal實例的引用。
什麼是ThreadLocal?
java.lang.ThreadLocal類實現了線程的本地存儲,我們可以用該類來創建和管理線程。
ThreadLocal的內部實現:
ThreadLocal的內部實現包括一個類似HashMap的對象,這裏稱之爲ThreadLocalMap。ThreadLocalMap的key會持有對ThreadLocal實例的弱引用(Weak Reference),value會引用TSO實例。
具體的可以參考:徹底理解ThreadLocal
ThreadLocal的使用:
《thinking in java 第四版》p690