【java】爲何通常“將ThreadLocal變量設置爲static”?

本文參考了: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

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