threadlocal 從名字上看,叫執行緒變數。可以理解為每個執行緒獨有的變數。
1. 看原始碼我們就會知道,threadlocal核心是threadlocalmap 容器。
2. 這個容器在set值時是以當前的threadlocal為key的,執行緒之間
的資訊都是獨享的,保證了執行緒安全問題。
3. 最重要的一點是map的這個key被傳遞給了弱引用。
4. 這裡說下弱引用:只要是觸發了gc弱引用就會被**
5. 由於3、4兩條,當threadlocal 引用 == null 值會被gc**
但是呢threadlocalmap和執行緒生命週期是一樣的不會被**,
此時被變成了key沒了但是value還在這樣就很容易造成記憶體洩漏
6. 所有當用完threadlocal 我們應該手動的去remove()下,避免記憶體洩漏
1.強: 我們常用的乙個引用 = new 物件()就是強引用.
當失去了引用,該物件在gc時就會被**。
2.軟: 當堆記憶體不足時,gc就**軟引用。軟引用經常用來做快取
3.弱: 只要觸發gc就會被**。
4.虛: **會返回乙個通知,
jvm工作者用來監控並**堆外記憶體用的。
ThreadLocal和強軟弱虛
強引用 strongreference 最傳統的 引用 的定義,是指在程式 之中普遍存在的引用賦值,即類似 object obj new object 這種引用關係。無論任何情況下,只要強引用關係還存在,垃圾收集器就永遠不會 掉被引用的物件。軟引用 softreference 在系統將要發生記憶體溢...
ThreadLocal為什麼不用強引用
我們看看key使用的 當hreadlocalmap的key為強引用 threadlocal時,因為threadlocalmap還持有threadlocal的強引用,如果沒有手動刪除,threadlocal不會被 導致entry記憶體洩漏。譬如 設定 threadlocal null 以後,應該會被 ...
併發程式設計14 ThreadLocal
public class threadlocaltest public int getnext public static void main string args catch interruptedexception e start new thread new runnable catch i...