先放結論:很多網上的文章說,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對象。