為什麼ThreaLocal是執行緒獨享的

2021-10-08 17:00:31 字數 1202 閱讀 8160

我們來先看一下threadlocal的get和set方法
public t get()

}return

setinitialvalue()

;}

public

void

set(t value)

我們在呼叫get和set方法時都會執行兩行**,

thread t = thread.currentthread(); //獲取當前執行緒

threadlocalmap map = getmap(t);//獲取threadlocalmap物件,注意這個getmap方法,這個是避免執行緒安全問題的關鍵

threadlocalmap getmap

(thread t)

threadlocal.threadlocalmap threadlocals = null;
在每個執行緒中會有乙個threadlocalmap,threadlocal在get和set時實際上是往執行緒中的threadlocalmap中訪問物件,所以其他執行緒是獲取不到當前執行緒的值的,但是有一種特殊情況需要注意,那就是執行緒池

因為執行緒池中的核心執行緒是不會被銷毀的,所有有可能會出現下乙個請求獲取到前乙個請求的值的情況

因此需要注意在每次用完threadlocal後要將其中的資料remove掉。如果不做remove操作的話還有可能會引起記憶體洩漏問題

使用inheritablethreadlocal即可。
我們來看一下thread中的init方法就明白了。

其中有幾行**是這樣的:

if

(inheritthreadlocals && parent.inheritablethreadlocals != null)

從這三行**我們可以發現,子執行緒建立是會判斷父執行緒中的inheritablethreadlocals 是否有值,如果有就將其中的值複製乙份到自己的inheritablethreadlocals 物件中,注意,這裡是複製乙份,因為在createinheritedmap方法中會重新建立乙個threadlocalmap物件。因此子執行緒中修改不會影響建立之後不會相互影響。

為什麼是 pgsql ?

postgresql在國外很流行 在日本是僅次於apache的開源軟體 pgsql 使用程序 postgresql資料庫是多程序的架構.每乙個客戶連線都有乙個服務程序為其進行服務,也有共享記憶體,這一點是與orancle資料庫是相似的.postgresql使用一種客戶端 伺服器的模式.乙個伺服器程序...

為什麼是XML

乙個人倒是可以隨便很多,大概是票價 的原因,今天的參加者不多,也沒遇見熟人。一天下來,思維不斷的轉換,人也有點迷迷糊糊了。最後一場,居然趕錯了會場,開講才知道是db2的講座,主講王先生是 ibm 的 fellow,以前聽過幾次他的演講,沒什麼深刻印象,今天他講 db2 和 xml。這幾年來,偶和 x...

為什麼是XML?

為什麼是xml 1 並不建議現在的edi 標準被直接對映成xml 來實現,重要的目的是抽取豐富的語義並應用在基於xml 的應用計算技術中。當使用xml 實現這種電子商務解決方案時,這種融合叫做xml edi。無論你是否理解edi 語法,我能肯定你一定確信使用xml 會使獲取過程的會話更易讀懂。但是還...