強引用(strongreference) : 最傳統的「引用」的定義,是指在程式**之中普遍存在的引用賦值,即類似「object obj=new object()」這種引用關係。無論任何情況下,只要強引用關係還存在,垃圾收集器就永遠不會**掉被引用的物件。
軟引用(softreference) :在系統將要發生記憶體溢位之前,將會把這些物件列入**範圍之中進行第二次**。如果這次**後還沒有足夠的記憶體,才會丟擲記憶體溢位異常。
0bject obj = new object(); //弱引用(weakreference) :被弱引用關聯的物件只能生存到下一次垃圾收集之前。當垃圾收集器工作時,無論記憶體空間是否足夠,都會**掉被弱引用關聯的物件。宣告強引用
softreferencesf = new softreference(obj);
obj = null; //
銷毀強引用
object obj = new object(); //虛引用(phantomreference) :乙個物件是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來獲得乙個物件的例項。為-乙個物件設定虛引用關聯的唯一目的就是能在這個物件被收集器**時收到乙個系統通知。宣告強引用
weakreferencewr = new weakreference(obj ) ;
obj = null; //
銷毀強引用
set()方法
public當呼叫set方法時,會將這個threadlocal物件作為key,傳入的值作為value,放進乙個map裡面去,這個map通過getmap方法獲取到,在getmap方法裡面返回的是當前執行緒對應的乙個map,裡面的threadlocals我們可以看到是thread類裡面的變數,原始碼如下:void
set(t value)
threadlocalmap getmap(thread t)threadlocals對應在thread裡面的位置如下:(與此執行緒有關的threadlocal值。該對映由threadlocal類維護)
回到set方法,裡面呼叫map.set(this, value)方法的原始碼如下:
privatecreatemap()方法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();
}
void的threadlocals繼承於thread類,而threadlocalmap的key就是在set方法裡面的entry,繼承自weakreferencecreatemap(thread t, t firstvalue)
若是強引用,即使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方...