一文搞定ThreadLocal

1 基本使用

1.1 常用方法

方法 描述
ThreadLocal() 創建ThreadLocal對象
pubic void set(T value) 設置當前線程綁定的局部變量
public T get() 獲取當前線程綁定的局部變量
public void remove() 移除當前線程綁定的局部變量

1.2 ThreadLocal類與synchronize關鍵字

Demo案例:

synchronize(Deme.class){
	//具體業務邏輯(setter/getter方法)
}

區別::儘管ThreadLocal與synchronize都用於處理多線程併發訪問,但是兩者處理問題的方法與思路不同。

synchronize ThreadLocal
原理 同步機制採用“時間換空間” 的方式 ,只提供了一份變量,讓不同的線程排隊訪問 ThreadLocal採用“空間換時間”的方式,爲每個線程都提供了一份變量的空間,從而實現同時訪問而互不相干擾
側重點 多個線程之間訪問資源的同步性 多線程中每個線程之間的數據相互隔離

總結:synchronize是線程同步,而ThreadLocal是線程之間獨立,互不影響,在多線程併發的場景下可以使用。

2 ThreadLocal源碼解析

2.1 JDK8中的源碼

Alt
ThreadLocal的設計:每個Thread維護一個ThreadLocalMap,這個Hash表的key是TheadLocal實例本身,value才能使真正要存儲的值爲Object類型。
(1)每個Thread線程內部都有一個Map(ThreadLocalMap),
(2)Map裏面存儲ThreadLocal對象(key)和線程的變量值(value)
(3)Thread內部的Map是由ThreadLocal維護的,有ThreadLocal負責向Map獲取和設置線程的變量值
(4)對於不同的線程,每次獲取value值時,別的線程並不能獲取到當前線程的value值,形成了value值的隔離,互不相干擾。
優點:
(1)這樣設計之後每隔Map存儲的Entry數量就會變少,因爲之前的存儲數量有Thread的數量決定,現在是有ThreadLocal的數量決定。
(2)當Thread銷燬之後,對應的ThreadLocalMap也會隨之銷燬,能較少內存的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章