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

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

多線程安全性解決方案安全

①進行同步控制synchronized  效率下降   併發變同步(串行)多線程

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

兩種線程安全方案的差別工具

歸納起來講,對於多線程資源共享的問題,同步機制採用了「以時間換空間」的方式,而        ThreadLocal採用了「以空間換時間」的方式。前者僅提供一份變量,讓不一樣的線程排隊        訪問,然後者爲每個線程都提供了一份變量,所以能夠同時訪問而互不影響。線程

擴展問題內存

咱們知道在通常狀況下,只有無狀態的Bean才能夠在多線程環境下共享,在Spring中, 絕大部分Bean均可以聲明爲singleton做用域。就是由於Spring對一些Bean(如RequestContextHolder、 TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態採用 ThreadLocal進行處理,讓它們也成爲線程安全的狀態,由於有狀態的Bean就能夠在多線程中共享了。資源

綜上所述:兩種解決方案,ThreadLocal佔用內存較大,可是速度快,而線程同步相對內存佔用小,可是速度慢。若是在內存比較充足的狀況,對併發部分的執行效率要求很高的話,那麼就是ThreadLocal登場的時候了。通常狀況下用同步機制仍是居多的。
 作用域

相關文章
相關標籤/搜索