ThreadLocal原理及記憶體洩漏原因
阿新 • • 發佈:2020-01-07
ThreadLocal有兩個問題:
1. 每個變數副本是儲存在哪了?
2. 變數副本是怎樣從共享的變數中賦值出來的?原始碼中threadlocal的初始值是什麼時候設定的。
ThreadLocal為每個執行緒維護一個變數的副本?
每個執行緒的ThreadLocalMap都是執行緒自身持有的,但是初始化是在ThreadLocal中,然後每個執行緒相當於儲存了一個map
這個map存的key是LocalThread的例項,value是儲存的執行緒的區域性變數
get方法
根據當前執行緒獲取Thread中的值
set方法
根據當前執行緒獲取當前執行緒的map,然後設定當前執行緒的值,
從而保證每個執行緒的值都是從自己的ThreadMap中獲取
ThreadLocal為什麼會引起記憶體洩漏
ThreadLocal的弱引用作為key,如果gc想要回收的時候,ThreadLcoal必然回收,Thread ref -> Thread ->ThreadLocalMap->Entry->value這個強引用一直就會存在,造成記憶體洩漏
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。