ThreadLocal原理和 java類全局靜態變量在多線程中數據混亂問題

通常想要在不一樣方法中傳遞上下文數據,會使用全局變量,而想在不一樣類中傳遞上下文數據,則會使用全局靜態變量,由於靜態全局變量是屬於類一直存在的,可是在多線程操做狀態下,java類全局靜態變量在多線程中會出現數據混亂問題,由於多個線程同時對同一個靜態變量操做時,沒法確保每一個線程取出的值是本身放的值。
這時就出現了ThreadLocal
ThreadLocal衆所周知,能夠把變量綁定到到某一線程上,這個thread裏有個靜態內部類(能夠理解爲一個全局變量ThreadLocalMap),java

 

 其泛型爲<ThreadLocal,Object> 安全

而threadlocal在執行set方法時會先獲取當前線程(Thread t = Thread.currentThread()),使用當前線程去拿到一個ThreadLocalMap,若是這個map不爲空,說明當前線程以前有綁定過的map,就更新這個這個map的value,若是沒有就以自身爲key把值放到map中,從而實現變量與線程的綁定。多線程

 

 

 

 關於ThreadLocal的用法,有這兩種說法併發

1.傳遞上下文變量,減小程序複雜度性能

2.空間換時間,解決併發下對臨界資源的訪問。spa

 

其次還要注意的是:ThreadLocal和同步機制synchonzied相比線程

Synchronized用於線程間的數據共享,而ThreadLocal則用於線程間的數據隔離。3d

1.1.synchonzied同步機制是爲了實現同步多線程對相同資源的併發訪問控制。同步的主要目的是保證多線程間的數據共享。同步會帶來巨大的性能開銷,因此同步操做應該是細粒度的(對象中的不一樣元素使用不一樣的鎖,而不是整個對象一個鎖)。若是同步使用得當,帶來的性能開銷是微不足道的。使用同步真正的風險是複雜性和可能破壞資源安全,而不是性能。 對象

2.ThreadLocal以空間換取時間,提供了一種很是簡便的多線程實現方式。由於多個線程併發訪問無需進行等待,因此使用ThreadLocal會得到更大的性能。blog

3.ThreadLocal中的對象,一般都是比較小的對象。另外使用ThreadLocal不能使用原子類型,只能使用Object類型。ThreadLocal的使用比synchronized要簡單得多。 

4.synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而ThreadLocal爲每個線程都提供了變量的副本,使得每一個線程在某一時間訪問到的並非同一個對象,這樣就隔離了多個線程對數據的數據共享。而Synchronized卻正好相反,它用於在多個線程間通訊時可以得到數據共享。 

 

 

相關文章
相關標籤/搜索