Java多執行緒之 ThreadLocal

2021-08-21 21:50:10 字數 1698 閱讀 7701

threadlocal是什麼:每乙個threadlocal能夠放乙個執行緒級別的變數,也就是說,每乙個執行緒有獨自的變數,互不干擾。以此達到執行緒安全的目的,並且一定會安全。

實現原理:

要了解實現原理,我們先看set方法

public void set(t value)
引數是我們要存的值 object

第一步取到當前執行緒

第二步有乙個方法getmap,點進去看(ps:準備好轉圈圈哦~),順便看一下thread類的乙個屬性

threadlocalmap getmap(thread t)
/* threadlocal values pertaining to this thread. this map is maintained

* by the threadlocal class. */

threadlocal.threadlocalmap threadlocals = null;

這個方法是取到了thread類的乙個例項變數threadlocalmap,而threadlocalmap是threadlocal的乙個內部類

向下看,如果map是空,那麼已當前物件為k,當前物件就是threadlocal啊,引數為值存進map,就是說threadlocalmap的鍵是外部類threadlocal,值是我們存的object。

簡單說,執行緒有乙個例項屬性threadlocalmap,map鍵是外部類threadlocal,值是存放的object。

第三步方法createmap

void createmap(thread t, t firstvalue)
建立當前執行緒的threadlocalmap並存放值

其實到這裡,已經對threadlocal了解的差不多了,本身是鍵,而乙個鍵只能對應乙個值,所以肯定不會互相影響啦。

get/remove方法

remove方法

public void remove()
取出當前執行緒的threadlocalmap。如果存在,移除當前threadlocal為鍵的鍵值對

get方法

public t get() 

}return setinitialvalue();

}

就簡單說了,取出當前執行緒的threadlocalmap,

如果map不為空取出當前threadlocal的entry物件,取出entry物件的值返回

如果為空返回方法setinitialvalue()

看方法

private t setinitialvalue()
第一步方法initialvalue()

protected t initialvalue()
返回乙個null

下面的就和之前的差不多了就不贅述了,最後返回null。

這裡說乙個我之前看到的threadlocal的『坑』

如果我們專案使用的是執行緒池,我們知道執行緒池可能不會輕易關掉執行緒,也就是說對應的threadlocalmap一旦建立,如果不加處理,他的生命週期和thread是一致的,那麼儲存的threadlocal物件的生命週期就不得而知了,久而久之,這個threadlocalmap越來越大,,會發生什麼,就不得而知了...

記錄到此

JAVA多執行緒之 執行緒池

執行緒池顧名思義,就是乙個放置執行緒的池子。就跟資料庫連線池差不多。執行緒池通過對併發執行緒的控制,能有效的節省系統資源的浪費,提高系統的效能。學習執行緒池,先了解一下執行緒池的乙個基本結構 executor是乙個介面,其中只有乙個方法,就是execute方法。所以executor實際就是乙個執行緒...

Java多執行緒之執行緒安全

當多個執行緒訪問某乙個類 物件或方法時 這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的。public class mythread extends thread public static void main string args 結果如下 t1正在執行 4 t1正在執行...

java 多執行緒 之 Excutor

excutor介面 提供了一種將任務提交和任務執行機制相分離的方法 excutorservice介面 提供了excutor的管理介面,以及可為跟蹤乙個或多個非同步任務狀態而生成future的方法 scheduledexcutorservice介面 提供了可以安排在給定的延遲後執行或定時執行的命令 方...