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中的源碼
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也會隨之銷燬,能較少內存的使用。