threadlocal與synchronized的區別是:threadlocal:每個執行緒單獨有乙個副本
synchronized:共用同乙個資源,加鎖
顯然threadlocal是用空間換時間
threadlocal大致儲存是這樣的:接下來我試著剖析一波每個執行緒有乙個threadlocalmap,即使不同的threadlocal例項,只要是同乙個執行緒他們共享的都是同乙個threadlocalmap
threadlocalmap以threadlocal例項為key,且設定key為弱引用進行儲存
設定key為弱引用的好處是,我不用這個threadlocalmap的時候,我只需要顯示將變數賦值為null,因為它沒有強引用了,我還設定它是弱引用,那gc就直接**了,這樣就不會造成記憶體洩漏的問題。【當然如果執行緒遲遲不結束,如果這個threadlocal物件還被被**了,那麼map中key雖然沒有了,但是value還在,而這個map的生命週期和執行緒生命週期一致,因此我們當前執行緒不使用threadlocal了,就呼叫其remove放法,進行釋放,否則仍然會造成記憶體洩漏】
當然如果我們只是當前執行緒不需要使用threadlocal了,那麼我們在當前執行緒直接手動呼叫remove()方法即可
可以看出,首先獲取當前執行緒的threadlocalmap,如果沒有建立一波,它是以當前threadlocal例項物件為key進行儲存public void set(t value)
可以看出,首先獲取當前執行緒的threadlocalmap,如果有則獲取當前首先獲取當前執行緒的threadlocal例項物件的entry,然後取出值,否則呼叫方法和set源**一樣,只不過設定預設值nullpublic t get()
}return setinitialvalue();
}
整個測試可以看出,首先獲取當前執行緒的threadlocalmap,然後移除當前threadlocal例項物件為key的valuepublic void remove()
裡面許多的注釋是從最初**的時候寫的,有的不一定對,以我上訪分析原始碼為準
/**
* @author ningxinjie
* @date 2021/2/3
*///
public class threadlocaltest
},"thead01").start();
thread.sleep(200);
// 同乙個執行緒共用同乙個threadlocalmap,但是key是threadlocal例項 ,這裡的例項是threadlocal2 ,因此沒有值
system.out.println(threadlocal2.get());
object o = threadlocal.get();
system.out.println(o);
// 移除當前執行緒的threadlocalmap
threadlocal.remove();
system.in.read();
}
ThreadLocal的作用與使用
在我們程式設計時,如果遇到多個執行緒訪問同乙個變數應該怎樣實現?有人說使用同步。是的同步可以解決這種問題,但它是有弊端的,涉及到何時加鎖與釋放鎖等並且執行緒訪問鎖時需要等待,這樣很浪費時間。有乙個更好的方案就是使用threadlocal工具類,之前參加了乙個專案,本專案涉及到分庫,在業務進行中需要根...
執行緒區域性變數ThreadLocal實現原理
之前做專案用到過threadlocal,但是沒有看原始碼層面的具體實現,今天特來補一補課。threadlocal,即執行緒區域性變數,用來為每乙個使用它的執行緒維護乙個獨立的變數副本。那種以時間換取空間的做法不同,threadlocal沒有任何鎖機制,它以空間換取時間的方式保證變數的執行緒安全。1 ...
ThreadLocal 用途與使用場景
threadlocal,即執行緒變數,是乙個以 threadlocal 物件為鍵 任意物件為值的儲存結構。概括起來說,對於多執行緒資源共享的問題,同步機制採用了 以時間換空間 的方式,而 threadlocal 採用了 以空間換時間 的方式。前者僅提供乙份變數,讓不同的執行緒排隊訪問 後者為每乙個執...