南通科迅教育JAVA培訓
女生更應該選擇JAVA培訓的思密達
深入研究java.lang.ThreadLocal類
一、概述
ThreadLocal是什么呢?其實ThreadLocal并非是一個線程的本地實現(xiàn)版本,它并不是一個Thread,而是threadlocalvariable(線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)其實的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是Java中一種較為特殊的線程綁定機制,是每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。
從線程的角度看,每個線程都保持一個對其線程局部變量副本的隱式引用,只要線程是活動的并且 ThreadLocal 實例是可訪問的;在線程消失之后,其線程局部實例的所有副本都會被垃圾回收(除非存在對這些副本的其他引用)。
通過ThreadLocal存取的數(shù)據(jù),總是與當前線程相關(guān),也就是說,JVM 為每個運行的線程,綁定了私有的本地實例存取空間,從而為多線程環(huán)境常出現(xiàn)的并發(fā)訪問問題提供了一種隔離機制。
ThreadLocal是如何做到為每一個線程維護變量的副本的呢?其實實現(xiàn)的思路很簡單,在ThreadLocal類中有一個Map,用于存儲每一個線程的變量的副本。
概括起來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。
二、API說明
ThreadLocal()
創(chuàng)建一個線程本地變量。
T get()
返回此線程局部變量的當前線程副本中的值,如果這是線程*次調(diào)用該方法,則創(chuàng)建并初始化此副本。
protected T initialValue()
返回此線程局部變量的當前線程的初始值。最多在每次訪問線程來獲得每個線程局部變量時調(diào)用此方法一次,即線程*次使用 get() 方法訪問變量的時候。如果線程先于 get 方法調(diào)用 set(T) 方法,則不會在線程中再調(diào)用 initialValue 方法。
若該實現(xiàn)只返回 null;如果程序員希望將線程局部變量初始化為 null 以外的某個值,則必須為 ThreadLocal 創(chuàng)建子類,并重寫此方法。通常,將使用匿名內(nèi)部類。initialValue 的典型實現(xiàn)將調(diào)用一個適當?shù)臉?gòu)造方法,并返回新構(gòu)造的對象。
void remove()
移除此線程局部變量的值。這可能有助于減少線程局部變量的存儲需求。如果再次訪問此線程局部變量,那么在默認情況下它將擁有其 initialValue。
void set(T value)
將此線程局部變量的當前線程副本中的值設(shè)置為指定值。許多應用程序不需要這項功能,它們只依賴于 initialValue() 方法來設(shè)置線程局部變量的值。
在程序中一般都重寫initialValue方法,以給定一個特定的初始值。