java ThreadLocal

JDKAPI 解釋:


       該類提供了線程局部 (thread-local) 變量。這些變量不一樣於它們的普通對應物,由於訪問某個變量(經過其get或set方法)的每一個線程都有本身的局部變量,它獨立於 初始化變量的副本。ThreadLocal實例一般是類中的 private static 字段,它們但願將狀態與某一個線程(例如,用戶 ID 或事務 ID)相關聯。

資料查找總結:


        ThreadLocal爲解決多線程程序的併發問題提供了一種新的思路。使用這個工具類能夠很簡潔地編寫出優美的多線程程序。


        我的認爲ThreadLocal 就是一種Map key-value 的實現思路。當使用ThreadLocal維護變量時,ThreadLocal爲每一個使用該變量的線程提供獨立的變量副本 。將每一個線程做爲key ,線程操做的數據做爲value。每一個線程能夠獨立修改本身的value ,而不影響其餘線程對應的value。


ThreadLocal方法詳細信息 :


initialValue
protected T initialValue()返回此線程局部變量的當前線程的「初始值」。線程第一次使用 get() 方法訪問變量時將調用此方法,但若是線程以前調用了 set(T) 方法,則不會對該線程再調用 initialValue 方法。一般,此方法對每一個線程最多調用一次,但若是在調用 get() 後又調用了 remove(),則可能再次調用此方法。 
該實現返回 null;若是程序員但願線程局部變量具備 null 之外的值,則必須爲 ThreadLocal 建立子類,並重寫此方法。一般將使用匿名內部類完成此操做。 

返回:
返回此線程局部變量的初始值

get
public T get()返回此線程局部變量的當前線程副本中的值。若是變量沒有用於當前線程的值,則先將其初始化爲調用 initialValue() 方法返回的值。 

返回:
此線程局部變量的當前線程的值


set
public void set(T value)將此線程局部變量的當前線程副本中的值設置爲指定值。大部分子類不須要重寫此方法,它們只依靠 initialValue() 方法來設置線程局部變量的值。 


參數:
value - 存儲在此線程局部變量的當前線程副本中的值。


remove
public void remove()移除此線程局部變量當前線程的值。若是此線程局部變量隨後被當前線程讀取,且這期間當前線程沒有設置其值,則將調用其 initialValue() 方法從新初始化其值。這將致使在當前線程屢次調用 initialValue 方法

   



      threadLocal和Synchonized都用於解決多線程併發訪問。可是ThreadLocal與synchronized有本質的區別。synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而ThreadLocal爲每個線程都提供了變量的副本,使得每一個線程在某一時間訪問到的並非同一個對象,這樣就隔離了多個線程對數據的數據共享。而Synchronized卻正好相反,它用於在多個線程間通訊時可以得到數據共享。 
Synchronized用於線程間的數據共享,而ThreadLocal則用於線程間的數據隔離。 
固然ThreadLocal並不能替代synchronized,它們處理不一樣的問題域。Synchronized用於實現同步機制,比ThreadLocal更加複雜。  程序員

 
相關文章
相關標籤/搜索