ThreadLocal個人理解

2021-05-24 21:55:01 字數 895 閱讀 5943

為了加深理解,將最近對threadlocal的了解和原始碼分析記錄總結一下。

threadlocal可以為執行緒提供區域性變數。使用threadlocal的get()方法,可以在當前執行緒能夠訪問的類和方法中,得與當前執行緒相關聯的變數值。

不過,執行緒區域性變數並不是由threadlocal物件儲存維護的,而是儲存在相關聯的執行緒中。threadlocal物件只是作為乙個key,為當前執行緒提供了

查詢區域性變數的線索。也就是說,不同的執行緒,以相同的threadlocal物件作為key,可以查詢到相關聯的變數值。

下面是threadlocal原始碼:

以上**用於生成與每個threadlocal物件的key,key值存放在threadlocalhashcode變數中。atomicinteger類保證了執行緒安全。

將當前threadlocal物件作為key值,而將與當前執行緒相關聯的變數值作為value,存放在乙個map中。

該map儲存在當前執行緒的threadlocals變數中。這個map儲存了所有的和該執行緒關聯的區域性變數。

當需要與當前執行緒相關聯的區域性變數時,用get()方法取出。從當前執行緒的threadlocals中取出區域性變數map,以當前threadlocal為key進行查詢。

threadlocalmap是threadlocal的乙個內部類,為區域性變數的儲存提供資料結構。在threadlocalmap內部,資料儲存是由乙個繼承了weakreference類的entry型別的陣列來實現的,該陣列以table作為其變數名。弱引用保證了在table過大的時候,可以將過於陳舊(stale)的entry**,而不是報出outofmemoryexception。並且,threadlocalmap提供了一套演算法,可以根據當前threadlocal物件的threadlocalhashcode值,快速的在table陣列中定位。

ThreadLocal個人理解

每乙個thread物件中有乙個threadlocalmap的map屬性 該map的key是乙個弱引用 key被weakreference物件指向 當gc時就會 該entry就會 map屬性,避免了記憶體洩漏 當使用threadlocal時,當threadlocal屬性作為map的key,將當前執行緒...

ThreadLocal的個人理解

threadlocal的設計思想十分簡單,它的核心物件就是threadlocalmap,被宣告在thread類裡面,每個thread都持有乙個threadlocalmap,所以才能實現執行緒隔離,以達到儲存共享變數的作用 threadlocal.threadlocalmap threadlocals...

個人對threadlocal的理解

threadlocal它操作的是當前執行緒的區域性變數 public void set t value public t get return setinitialvalue public void remove 上面是threadlocal的get 和set 方法的原始碼,可以看到threadlo...