案例
public static void main(string args)
}, "cc1").start();
new thread(new runnable()
}, "cc2").start();
}
輸出:
cc1: 2
cc2: null
threadlocal的set(t t)方法原始碼
public void set(t value)
threadlocalmap的set(threadlocal key, object value)方法原始碼
private void set(threadlocal> key, object value)
// 若獲取的k為null,則表示這個變數已經被刪除了,則去清理一下table陣列,並對陣列中元素進行清理並設定新的entry例項
if (k == null)
} // **走到這一步,說明該執行緒第一次設定資料,建立新的entry例項放在table的第i個位置上
tab[i] = new entry(key, value);
int sz = ++size;
// 清理table中的元素,若長度達到了擴容閾值,則對table進行擴容,擴容為原陣列長度的2倍
if (!cleansomeslots(i, sz) && sz >= threshold)
rehash();
}
threadlocal的createmap(thread t, t firstvalue)方法原始碼
void createmap(thread t, t firstvalue)
threadlocalmap的構造器原始碼
threadlocalmap(threadlocal> firstkey, object firstvalue)
以上便是threadlocal達到執行緒隔離的基本解析,講解的比較基礎,其實就是jdk原始碼鑑賞,還有什麼不懂的地方就自己去看原始碼吧。
延伸下
threadlocal的get()方法原始碼
public t get()
} return setinitialvalue();
}
這段**比較簡單,這裡就不在進行解釋了,我們著重看一下最後一句setinitialvalue()
這個方法
private t setinitialvalue()
protected t initialvalue()
會發現和set方法類似,只不過是將乙個null
當做value而已,所以我們在沒給threadlocal設定值的情況下呼叫get方法,則會為其建立乙個預設的null值並返回null。
留乙個思考題
因為我們每個執行緒的threadlocal的key的hash值都是固定的,那麼thread的threadlocals變數的table中會有多少個非null元素呢?
ThreadLocal是什麼?怎麼用?
threadlocal用於儲存某個執行緒共享變數 對於同乙個static threadlocal,不同執行緒只能從中get,set,remove自己的變數,而不會影響其他執行緒的變數。簡單的使用 public class threadlocaltestpublic class mytest exte...
mysql索引實現 mysql 索引是怎麼實現的?
看了很多關於索引的部落格,講的大同小異。但是始終沒有讓我明白關於索引的一些概念,如b tree索引,hash索引,唯一索引.或許有很多人和我一樣,沒搞清楚概念就開始研究b tree,b tree等結構,導致在面試的時候答非所問!本文中有關儲存引擎請檢視mysql儲存引擎 innodb和myisam ...
ThreadLocal是怎樣煉成的
好久沒更新部落格了,一直都有學習新知識,但是沒時間總結,主要因為顧著去發展模型興趣去了哈 難得靜下來寫一篇部落格 閒話不多說,直接進入主題 threadlocal是解決執行緒安全問題乙個很好的思路,threadlocal類中有乙個map,用於儲存每乙個執行緒的變數副本,map中元素的鍵為執行緒物件,...