ThreadLocal是怎麼實現執行緒隔離的

2021-10-06 23:22:09 字數 1820 閱讀 9619

案例

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中元素的鍵為執行緒物件,...