ThreadLocal源碼閱讀六:核心方法get源碼探究

背景

  1. 推薦閱讀ThreadLocal工作過程魔數的學習和疑問思考ThreadLocal解決Hash碰撞
  2. 探究ThreadLocal源碼中核心方法get的工作過程及其實現細節。

過程

  • get入口函數
    在這裏插入圖片描述

    註釋含義:獲取到當前線程的本地變量值的拷貝。如果當前線程沒有值,就返回初始化的值。

    細節

      	1. 獲取到當前線程。
      	2. 獲取到當前線程的ThreadLocalMap實例
      	3. 如果不爲空,就根據當前對象this,也就是ThreadLocal,獲取到entry實例。
      	4. 如果爲空,執行setInitialValue()。其實就是set源碼。
    

set源碼

  • map.getEntry()
    在這裏插入圖片描述
    註釋含義:獲取跟key關聯的entry實例。因爲entry(key,value),其中key是ThreadLocal實例。這是快速訪問,就是地址訪問,數組訪問是O(1),因爲數組中存儲的是地址,而我們可以計算出來的i其實,訪問的時候,就是地址訪問到具體內存,無需遍歷整個數組。如果沒有找到,就執行方法getEntryAfterMiss。

    細節

      	1. 求得當前key所對應的數組下標。
      	2. 根據下標獲取到enry實例。
      	3. 如果不爲null,而且entry實例的key就是當前的key,那麼返回entry實例。
      	4. 如果爲null。或者不爲null,但是entry實例的key不是當前的key,則執行方法getEntryAfterMiss。
    
  • getEntryAfterMiss(key, i, e)
    在這裏插入圖片描述
    細節

      	1. 如果傳遞過來的entry實例,這裏是e,是null的時候,直接返回null即可。
      	2. 如果傳遞過來的entry實例,這裏是e,不是null的時候。如果k == key,則直接返回e;  如果 k == null, 則需要把下標是i的entry給清除掉即可;如果不滿足上面兩個條件,則向後遍歷整個數組,直到找到或者找不到。找到就返回即可,找不就返回null。
    
  • 理解這樣探究源碼執行流程有什麼意義

    沒有,因爲代碼直接告訴了我們它是怎麼工作的,完全沒有必要這樣一步一步寫出來。如果,寫出來,也僅僅是加深印象和複習。因爲,分析爲什麼作者把ThreadLocal設計成弱引用,分析環形數組帶來利和弊,分析散列算法的特性,分析解決hash衝突原理。懂了這些,研讀源碼,就沒有太大的意義了。但是,正是自己最開始研究源碼,才懂得作者爲什麼這樣設計的。

小結

  1. 一步一步寫源碼執行流程,本身沒有太大的意義。因爲源碼已經告訴了我們它是怎樣運作的,而我們僅僅是把英文或者語言語法翻譯過來而已,這樣做絕對是沒有多大意義的。

  2. 那究竟怎麼做纔是意義?

    以爲懂了ThreadLocal是怎麼工作的,能夠把源碼實現的每個細節掌握了,也就是閱讀源碼沒有任何障礙了,其實也是中級階段。這層還是很好的。

  3. 真正有價值和有意義的是什麼?

    那就是懂背後設計的意圖。什麼意圖?就是作者爲什麼設計環形數組?爲什麼設計ThreadLocal爲弱引用?它用了什麼原理來解決hash衝突的?這纔是價值。這層是高級階段。

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