淺談Java中的ThreadLocal的多線程應用問題

什么是ThreadLocal?首先要說明的一點是ThreadLocal并不是一個Thread,而是Thread的局部變量。在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal為解決多線程程序的并發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多線程程序。當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。下面我們就來看看ThreadLocal的初步內容:

多線程安全性解決方案

①進行同步控制synchronized? 效率降低? 并發變同步(串行)

②使用ThreadLocal 本地線程? 每個線程一個變量副本(各不相干)

兩種線程安全方案的差異

概括起來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而? ? ? ? ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊? ? ? ? 訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。

擴展問題

我們知道在一般情況下,只有無狀態的Bean才可以在多線程環境下共享,在Spring中, 絕大部分Bean都可以聲明為singleton作用域。就是因為Spring對一些Bean(如RequestContextHolder、 TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態采用 ThreadLocal進行處理,讓它們也成為線程安全的狀態,因為有狀態的Bean就可以在多線程中共享了。

綜上所述:兩種解決方案,ThreadLocal占用內存較大,但是速度快,而線程同步相對內存占用小,但是速度慢。如果在內存比較充足的情況,對并發部分的執行效率要求很高的話,那么就是ThreadLocal登場的時候了。一般情況下用同步機制還是居多的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容