何時以及如何使用ThreadLocal變量?

何時應該使用ThreadLocal變量? 緩存

如何使用? 安全


#1樓

您必須很是謹慎地使用ThreadLocal模式。 有一些主要的缺點,例如Phil提到的,但沒有提到的一個是確保設置ThreadLocal上下文的代碼不是「可重入的」。 服務器

當設置信息的代碼第二次或第三次運行時,可能會發生很差的事情,由於線程上的信息可能在您不指望的時候開始發生變異。 所以,在再次設置以前,請確保未設置ThreadLocal信息。 app


#2樓

這裏沒有什麼新鮮的東西,可是我今天發現,在Web應用程序中使用Bean驗證時, ThreadLocal很是有用。 驗證消息已本地化,但默認狀況下使用Locale.getDefault() 。 您可使用其餘MessageInterpolator配置Validator ,可是在調用validate時沒法指定Locale 。 所以,您能夠建立一個靜態ThreadLocal<Locale> (或者更好的是,一個具備其餘內容的常規容器,您可能須要成爲ThreadLocal ,而後讓您的自定義MessageInterpolator從中選擇Locale 。下一步是編寫一個使用會話的ServletFilter value或request.getLocale()來選擇語言環境並將其存儲在ThreadLocal引用中。 spa


#3樓

Webapp服務器可能會保留一個線程池,應在響應客戶端以前刪除ThreadLocal ,這樣,下一個請求能夠重用當前線程。 線程


#4樓

  1. Java的ThreadLocal在JDK 1.2上引入,但後來在JDK 1.5中被泛化,以在ThreadLocal變量上引入類型安全性。 code

  2. ThreadLocal能夠與Thread範圍關聯,由Thread執行的全部代碼均可以訪問ThreadLocal變量,可是兩個線程彼此看不到ThreadLocal變量。 教程

  3. 每一個線程都擁有ThreadLocal變量的互斥副本,在正常狀況下或因爲任何異常而致使線程結束或死亡後,該線程纔有資格進行垃圾回收,由於這些ThreadLocal變量沒有任何其餘實時引用。 get

  4. Java中的ThreadLocal變量一般是類中的私有靜態字段,並在Thread中維護其狀態。 it

閱讀更多: Java中的ThreadLocal-示例程序和教程


#5樓

緩存時,有時您須要花費大量時間計算相同的值,所以經過將最後一組輸入存儲到方法和結果中,能夠加快代碼的速度。 經過使用線程本地存儲,您無需考慮鎖定。

相關文章
相關標籤/搜索