ThreadLocal使用與原理探索

2022-03-25 20:28:40 字數 1813 閱讀 3944

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()方法即可

接下來我試著剖析一波
public void set(t value)
可以看出,首先獲取當前執行緒的threadlocalmap,如果沒有建立一波,它是以當前threadlocal例項物件為key進行儲存

public t get() 

}return setinitialvalue();

}

可以看出,首先獲取當前執行緒的threadlocalmap,如果有則獲取當前首先獲取當前執行緒的threadlocal例項物件的entry,然後取出值,否則呼叫方法和set源**一樣,只不過設定預設值null

public void remove()
可以看出,首先獲取當前執行緒的threadlocalmap,然後移除當前threadlocal例項物件為key的value

整個測試
裡面許多的注釋是從最初**的時候寫的,有的不一定對,以我上訪分析原始碼為準

/**

* @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 採用了 以空間換時間 的方式。前者僅提供乙份變數,讓不同的執行緒排隊訪問 後者為每乙個執...