什么是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登場的時候了。一般情況下用同步機制還是居多的。