我們來先看一下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 會使獲取過程的會話更易讀懂。但是還...