threadlocal是什麼:每乙個threadlocal能夠放乙個執行緒級別的變數,也就是說,每乙個執行緒有獨自的變數,互不干擾。以此達到執行緒安全的目的,並且一定會安全。
實現原理:
要了解實現原理,我們先看set方法
public void set(t value)
引數是我們要存的值 object
第一步取到當前執行緒
第二步有乙個方法getmap,點進去看(ps:準備好轉圈圈哦~),順便看一下thread類的乙個屬性
threadlocalmap getmap(thread t)
這個方法是取到了thread類的乙個例項變數threadlocalmap,而threadlocalmap是threadlocal的乙個內部類/* threadlocal values pertaining to this thread. this map is maintained
* by the threadlocal class. */
threadlocal.threadlocalmap threadlocals = null;
向下看,如果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方法
就簡單說了,取出當前執行緒的threadlocalmap,public t get()
}return setinitialvalue();
}
如果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介面 提供了可以安排在給定的延遲後執行或定時執行的命令 方...