什麼是ThreadLocal
該類提供了線程局部變量,就是爲每一個使用它的線程提供一個變量的副本,使每一個
線程可以獨立的改變自己的副本,而不會和其它線程發生衝突。說白了就是解決對線程訪問共享
資源時發生衝突的問題,也算是一種同步的方式。
ThreadLocal的實現原理
public class ThreadLocal { private Map values = Collections.synchronizedMap(new HashMap()); public Object get() { Thread curThread = Thread.currentThread(); Object o = values.get(curThread); if (o == null && !values.containsKey(curThread)) { o = initialValue(); values.put(curThread, o); } return o; } public void set(Object newValue) { values.put(Thread.currentThread(), newValue); } public Object initialValue() { return null; } }
思路就是他的底層維護了一個線程安全的Map,Map就以鍵值對的形式存儲線程對象和線程對象的副本值。
ThreadLocal的常用api
其中initialValue()方法用於返回此線程局部變量的當前線程的初始值,該方法是一個延遲調用的方法,只有當線程第一次調用get或者set
方法時,他纔會執行,並且只執行這一次。還有他是一個protected修飾的方法,可以方便子類重寫該方法,可以根據需求進行自定義的初始化。
ThreadLocal與其他同步機制的區別
ThreadLocal與普通的同步機制都是爲了解決多線程訪問共享資源時會產生衝突的問題,普通的同步機制是控制了線程對共享資源的
訪問時間而避免衝突的,他是多個線程進行通信的有效方式,而ThreadLocal則是在空間上對共享數據進行了隔離,從根本上來說,數據已經
不在共享了以此避免衝突。因此兩種方式是在不同的角度所實現的線程安全。
當我們需要多線程之間進行通信就使用同步機制,需要隔離多個線程之間的共相沖突,就是用ThreadLocal。