為什么threadLocalMap要設計為Static的雙層map,如果設計為非靜態的單層map有什么問題?
如下:
public?class?MyThreadLocal<T>?{
????/**
?????*?key:?threadId;?value:存儲內容
?????*/
????private?Map<Long,?T>?threadMap?=?new?HashMap<>();
????public?void?set(T?data){
????????long?threadId?=?Thread.currentThread().getId();
????????threadMap.put(threadId,?data);
????}
????public?T?get(){
????????long?threadId?=?Thread.currentThread().getId();
????????if?(!threadMap.containsKey(threadId))?{
????????????threadMap.put(threadId,?initialValue());
????????}
????????return?threadMap.get(threadId);
????}
????protected?T?initialValue(){
????????return?null;
????}
}我感覺這樣已經完全能實現線程隔離的功能。
老師那種寫法,是因為JDK設計threadLocalMap屬于Thread的成員變量,所以才需要雙重Map嵌套。
我的理解正確嗎?如果正確的話,為什么JDK要這樣設計,而不用我的這種寫法?
2020-12-09
HashMap。本身就不是線程安全的,所以 你這個寫法 我暫時不確定 是不是能正確的運行?
但是既然不是線程安全的? 所以 我覺得 不可以這樣寫
如果你加個鎖 確實可以 變成安全的 操作
但是就會 變成多線程 競爭鎖? ?非常消耗性能
雖然實現了 類似功能 但是性能 太低?
所以JDK 不會這樣設計
2020-06-14
如果不是static,你怎么知道你存到哪里(哪個實例的變量里)了呢