什麼是ThreadLocal
java
該類提供了線程局部變量,就是爲每個使用它的線程提供一個變量的副本,使每個
api
線程能夠獨立的改變本身的副本,而不會和其它線程發生衝突。說白了就是解決對線程訪問共享安全
資源時發生衝突的問題,也算是一種同步的方式。
多線程
ThreadLocal的實現原理
ide
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的經常使用api3d
其中initialValue()方法用於返回此線程局部變量的當前線程的初始值,該方法是一個延遲調用的方法,只有當線程第一次調用get或者set對象
方法時,他纔會執行,而且只執行這一次。還有他是一個protected修飾的方法,能夠方便子類重寫該方法,能夠根據需求進行自定義的初始化。blog
ThreadLocal與其餘同步機制的區別資源
ThreadLocal與普通的同步機制都是爲了解決多線程訪問共享資源時會產生衝突的問題,普通的同步機制是控制了線程對共享資源的
訪問時間而避免衝突的,他是多個線程進行通訊的有效方式,而ThreadLocal則是在空間上對共享數據進行了隔離,從根本上來講,數據已經
不在共享了以此避免衝突。所以兩種方式是在不一樣的角度所實現的線程安全。
當咱們須要多線程之間進行通訊就使用同步機制,須要隔離多個線程之間的共相沖突,就是用ThreadLocal。