【重學Java】(四)Handler與ThreadLocal

先放結論:很多網上的文章說,threadlocal是以當前線程作爲key的,這個說法是錯誤的。正確的說法是:threadlocal用自己做key,存到threadlocalmap中,因爲一個Thread只有一個threadlocalmap,這個map中存儲了當前線程所有的threadlocal對象。

由一道面試題引申:Handler中如何保證它的Looper是唯一的? 答案:ThreadLocal

我們知道,Looper循環是從Looper.prepare開始的:

可以看到這裏sThreadLocal直接set值,我們到ThreadLocal中看下set做了什麼

這裏獲取了當前線程,並且從Thread中獲取了ThreadLocalMap(如果沒有,那就直接創建),這樣就保證了一個線程中只有一個ThreadMap。那麼,map.set(this,value)又做了什麼呢?

set方法中,通過threadlocal自己作爲key對map長度取餘得到插入位置,通過開放尋址法,找到對應的插入位置,如果發現之前插入過了,則更新這個值。

至於get方法,就更簡單了

直接去threadlocalmap裏面去找,如果map沒有初始化就觸發初始化。

 

總結一下:很多網上的文章說,threadlocal是以當前線程作爲key的,這個說法是錯誤的。正確的說法是:threadlocal用自己做key,存到threadlocalmap中,因爲一個Thread只有一個threadlocalmap,這個map中存儲了當前線程所有的threadlocal對象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章