ThreadLocal原始碼及存在的記憶體洩漏分析

2021-08-02 17:59:22 字數 1205 閱讀 7060

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...