搜尋
首頁Javajava教程教你正確閱讀jdk原始碼

教你正確閱讀jdk原始碼

Apr 08, 2019 pm 04:47 PM
javajdk

這篇文章主要講述jdk本身的源碼該如何閱讀,關於各種框架的源碼閱讀我們後面再一起探討。

筆者認為閱讀原始碼主要包括以下幾個步驟。

設定目標

凡事皆有目的,閱讀原始碼也是一樣。

從大的方面來說,我們閱讀原始碼的目的是為了提升自己的技術能力,運用到工作中,遇到問題快速定位,升職加薪等等。

從小的方面來說,閱讀某一段原始碼的目的就是要搞清楚它的原理,就是死磕,就是那種探索真相的固執。

目的是抽象的,目標是具體的,我們在閱讀原始碼之前一定要給自己設定一個目標。

例如,下一章我們將要一起學習的ConcurrentHashMap,我們可以設定以下目標:

(1)熟悉ConcurrentHashMap的儲存結構;

(2)熟悉ConcurrentHashMap中主要方法的實作過程;

(3)探索ConcurrentHashMap中出現的新技術;

#有了目標之後,我們要試著提出一些問題。

還是以ConcurrentHashMap為例,筆者提出了下列這些問題:

(1)ConcurrentHashMap與HashMap的資料結構是否一樣?

(2)HashMap在多執行緒環境下何時會出現並發安全性問題?

(3)ConcurrentHashMap是怎麼解決並發安全的問題?

(4)ConcurrentHashMap使用了哪些鎖?

(5)ConcurrentHashMap的擴容是怎麼進行的?

(6)ConcurrentHashMap是否是強烈一致性的?

(7)ConcurrentHashMap不能解決哪些問題?

(8)ConcurrentHashMap除了並發安全,還有哪些與HashMap不同的地方,為什麼要那麼實現?

(8)ConcurrentHashMap中有哪些不常見的技術值得學習?

如何提出問題

很多人會說,我也知道要提出問題,但是該怎麼提出問題呢?

這確實是很困難的一件事,筆者認為主要是三點:

(1)問自己

把自己當成面試官問自己,往死裡問的那種。

如果問自己問不出幾個問題,也不要緊,請看下面。

(2)問互聯網

很多問題可能自己也想不到,那就需要上網大概查一下相關的博客,看人家有沒有提出什麼問題。

或者,查詢相關面試題。

例如,筆者學習ConcurrentHashMap這個類別時,上網一查很多都是基於jdk7的,那這時候就可以提出一個問題,jdk8與jdk7中ConcurrentHashMap這個類別的實作方式有何不同? jdk8對jdk7作了哪些優化?

(3)不斷發現問題

一開始提不出幾個問題也不要緊,關鍵是要看,看了才能發現更多的問題。

帶著問題閱讀原始碼,忽略不必要的細節,死磕重要的細節

首先,一定要帶著問題閱讀原始碼。

其次,一定要忽略不必要的細節。

再,一定要死磕重要的細節。

乍一看,後面兩步似乎有所矛盾,其實不然,忽略不必要的細節是為了不迷失在源碼的世界中,死磕重要的細節是為了弄清楚源碼的真相。

這裡的細節是忽略還是死磕,主要是看跟問題的相關性。

jdk源碼還是比較好閱讀的,如果後面看spring的源碼,做不到忽略不必要的細節,真的是會迷失的,先埋個伏筆哈~~

#舉個例子,之前閱讀過ArrayList的序列化相關的程式碼中的readObject()方法。

<span style="font-family: 宋体, SimSun;">"s.readInt();"</span>這行是幹嘛的?省略行不行?這時候就要去了解序列化相關的知識,然後看看writeObject()裡面的實現,這就是要死磕的程式碼。

<span style="font-family: 宋体, SimSun;">"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);"</span>這行又是幹嘛的?乍一看,好像是跟權限相關的程式碼,跟我們的問題「序列化」無關,忽略之,如果實在想知道,先打個標記,等把序列化的問題解決了再來研究這個東西。

private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
    // 声明为空数组
    elementData = EMPTY_ELEMENTDATA;

    // 读入非transient非static属性(会读取size属性)
    s.defaultReadObject();

    // 读入元素个数,没什么用,只是因为写出的时候写了size属性,读的时候也要按顺序来读
    s.readInt();

    if (size > 0) {
        // 计算容量
        int capacity = calculateCapacity(elementData, size);
        SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);
        // 检查是否需要扩容
        ensureCapacityInternal(size);
        
        Object[] a = elementData;
        // 依次读取元素到数组中
        for (int i=0; i<size; i++) {
            a[i] = s.readObject();
        }
    }
}

多做比較

在閱讀jdk原始碼的時候,還有很重要的一點,就是要多做比較,比較也可以分為橫向比較和縱向比較。

(1)橫向比較

就是與相似的類別做比較。例如,集合模組中,基本上都是各種插入、查詢、刪除元素,那這時候可以從資料結構、時間複雜度等維度來比較,這就是橫向比較。

(2)縱貫比較

可以從集合發展的歷史來比較。例如,HashMap的發展史,從(單一數組)實現(沒錯,可以直接用一個數組實現HashMap),到(多數組鍊錶)實現,再到jdk8中的(多數組鍊錶紅黑樹)實現,這就是縱向比較。

多做實驗

最後一步,最最最重要的就是要多做實驗。

例如,ConcurrentHashMap是不是強一致性的?

可以啟動多個執行緒去不斷呼叫get()、put()、size()方法,看看是不是強一致性的。

耐心&堅持

這一點我不多說,大家都懂得。

不管是什麼領域,耐心&堅持都是最難能可貴的品質。

閱讀原始碼也是一樣,只要耐心地堅持下去,終將有所收穫。

【推薦課程:Java影片教學

#

以上是教你正確閱讀jdk原始碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)