threadlocal 是乙個特殊的物件,用於每個執行緒儲存自己的物件,執行緒安全,使用很簡單。
threadlocal local
=new threadlocal();
t t =
new t();
local
.set(t);
t t1 =
local
.get();
實現也很簡單,本文從set和get方法來分析threadlocal內部原始碼實現
// set 原始碼
public
void
set(t value)
set方法實現很簡單,從上面原始碼中可以看出,每個執行緒物件都有乙個threadlocalmap物件以threadlocal物件為key來儲存值。
threadlocalmap是threadlocal內部的乙個實現,類似於map的實現,也是鍵值對儲存。從上面原始碼可以看出threadlocal的set就是threadlocalmap的set實現。同樣 threadlocal的get方法也是threadlocalmap的get來獲取值,原始碼不一一展示了。
繼續分析threadlocalmap的實現。內部也是entry實現,重點分析entry介面,原始碼如下
static class
entry
extends
weakreference
<?>>
}
從原始碼中可以看出,該entry和map.entry實現有點不一樣,threadlocalmap的entry的key是threadlocal的弱引用,至於這裡為什麼是弱引用,在下面逐一分析。
然後繼續分析threadlocalmap的get,set方法。
下面下分析set方法,先貼原始碼
private
void
set(threadlocal<?> key, object value)
// 這裡的實現很重要,
if (k == null)
}tab[i] = new entry(key, value);
int sz = ++size;
if (!cleansomeslots(i, sz) && sz >= threshold)
rehash();
}
ThreadLocal 應用及原始碼分析
用 threadlocal 包裝的物件,對於每乙個執行緒,都會保留被包裝物件的副本,從一定程度上保證共享變數的執行緒安全性 threadlocal 非常適合需要執行緒安全的全域性變數,也常應用於各類上下文 我們以 sprig security 的應用場景為例,使用者的每次請求都會攜帶上 cookie...
ThreadLocal原始碼理解
threadlocal其實原理是建立了多份相同資料儲存在堆記憶體上,每個執行緒的thread類裡有threadlocal.threadlocalmap threadlocals的屬性來指向存位置,所以每個執行緒修改都不會影響到其他執行緒的資料 首先說下下面用到的東西 threadlocalmap為t...
ThreadLocal原始碼分析
在理解handler looper之前,先來說說threadlocal這個類,聽名字好像是乙個本地執行緒的意思,實際上它並不是乙個thread,而是提供乙個與執行緒有關的區域性變數功能,每個執行緒之間的資料互不影響。我們知道使用handler的時候,每個執行緒都需要有乙個looper物件,那麼and...