ThreadLocal和強軟弱虛

2022-06-18 08:39:15 字數 2066 閱讀 3998

強引用(strongreference) : 最傳統的「引用」的定義,是指在程式**之中普遍存在的引用賦值,即類似「object obj=new object()」這種引用關係。無論任何情況下,只要強引用關係還存在,垃圾收集器就永遠不會**掉被引用的物件。

軟引用(softreference) :在系統將要發生記憶體溢位之前,將會把這些物件列入**範圍之中進行第二次**。如果這次**後還沒有足夠的記憶體,才會丟擲記憶體溢位異常。

0bject obj = new object(); //

宣告強引用

softreferencesf = new softreference(obj);

obj = null; //

銷毀強引用

弱引用(weakreference) :被弱引用關聯的物件只能生存到下一次垃圾收集之前。當垃圾收集器工作時,無論記憶體空間是否足夠,都會**掉被弱引用關聯的物件。

object obj = new object(); //

宣告強引用

weakreferencewr = new weakreference(obj ) ;

obj = null; //

銷毀強引用

虛引用(phantomreference) :乙個物件是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來獲得乙個物件的例項。為-乙個物件設定虛引用關聯的唯一目的就是能在這個物件被收集器**時收到乙個系統通知。

set()方法

public

void

set(t value)

當呼叫set方法時,會將這個threadlocal物件作為key,傳入的值作為value,放進乙個map裡面去,這個map通過getmap方法獲取到,在getmap方法裡面返回的是當前執行緒對應的乙個map,裡面的threadlocals我們可以看到是thread類裡面的變數,原始碼如下:

threadlocalmap getmap(thread t)
threadlocals對應在thread裡面的位置如下:(與此執行緒有關的threadlocal值。該對映由threadlocal類維護)

回到set方法,裡面呼叫map.set(this, value)方法的原始碼如下:

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();

}

createmap()方法

void

createmap(thread t, t firstvalue)

的threadlocals繼承於thread類,而threadlocalmap的key就是在set方法裡面的entry,繼承自weakreference

若是強引用,即使tl=null, 但key 的引用依然指向threadlocal物件,即:當threadlocal不再使用需要**時,發現某個執行緒中threadlocalmap存在該threadlocal的強引用,無法**,造成記憶體洩漏所以會有記憶體洩露,而使用弱引用則不會;

但還是有記憶體洩漏存在,threadlocal被**,key的值 變成null,則導致整個value再也無法被訪問到,因此依然存在記憶體洩漏,因此要加乙個remove方法,在每次get和set的時候都會清除掉key為null的資料。

就是用的threadlocal,每個執行緒呼叫保證都是同乙個連線

併發 ThreadLocal 強 軟 弱 虛

threadlocal 從名字上看,叫執行緒變數。可以理解為每個執行緒獨有的變數。1.看原始碼我們就會知道,threadlocal核心是threadlocalmap 容器。2.這個容器在set值時是以當前的threadlocal為key的,執行緒之間 的資訊都是獨享的,保證了執行緒安全問題。3.最重...

ThreadLocal為什麼不用強引用

我們看看key使用的 當hreadlocalmap的key為強引用 threadlocal時,因為threadlocalmap還持有threadlocal的強引用,如果沒有手動刪除,threadlocal不會被 導致entry記憶體洩漏。譬如 設定 threadlocal null 以後,應該會被 ...

ThreadLocal理解和應用

本篇部落格將為大家介紹一下threadlocal。從用途 使用方法 原理 及常見問題四個方面來介紹。threadlocal用途可以理解成乙個 儲物間 這個 儲物間 當中擁有大量的 儲物櫃 每個 儲物櫃 實際上就是每個執行緒,當中存放的是thread執行緒中引數,針對於threadlocal的set方...