ThreadLocal的原理与使用
2019獨角獸企業重金招聘Python工程師標準>>>
通過源碼解讀ThreadLocal類的實現
?
ThreadLocal類提供了以下幾個方法
?
首先我們來看一下ThreadLocal是如何為每個線程創建一個變量副本的:
???? 第160行,獲取當前線程對象實例
?? 第161行,通過當前線程對象實例獲取一個ThreadLocalMap,這個map是ThreadLocal類的一個內部靜態類,
?? 如果map不為空接著獲取map中的entry,
這里獲取鍵值對傳進去的是? this,而不是當前線程t
?? 如果獲取成功,則返回value值
? ?如果map為空,則調用setInitialValue方法返回value
?? 我們上面的每一句來仔細分析:
??? 首先看一下getMap方法中做了什么?
??
在getMap中,是調用當期線程t,返回當前線程t中的一個成員變量threadLocals。
那么我們繼續取Thread類中取看一下成員變量threadLocals是什么:
實際上就是一個ThreadLocalMap,這個類型是ThreadLocal類的一個內部類,我們繼續取看ThreadLocalMap的實現:
?
可以看到ThreadLocalMap的Entry繼承了WeakReference,并且使用ThreadLocal作為鍵值。
然后再繼續看setInitialValue方法的具體實現:
很容易了解,就是如果map不為空,就設置鍵值對,為空,再創建Map,看一下createMap的實現:
以上源碼就可以看出:
首先在每個線程Thread內部有一個ThreadLocal.ThreadLocalMap類型的成員變量threadLocals,這個threadLocals就是用來存儲實際變量副本的,鍵值為當前ThreadLocal變量,value為變量副本(即T類型的變量)。
初始時,在Thread里面,threadLocals為空,當通過ThreadLocal變量調用get()方法或者set()方法,就會對Thread類中的threadLocals進行初始化,并且以當前ThreadLocal變量為鍵值,以ThreadLocal要保存的副本變量為value,存到threadLocals。
?
轉載于:https://my.oschina.net/shxjinchao/blog/1936469
總結
以上是生活随笔為你收集整理的ThreadLocal的原理与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: koa-static使用时报Unexpe
- 下一篇: 对象的浅克隆与深克隆