關於JDK源碼:我想聊聊如何更高效地閱讀

来源:https://www.cnblogs.com/tong-yuan/archive/2019/11/29/11955068.html
-Advertisement-
Play Games

簡介 大家好,我是彤哥,今天我想和大家再聊聊JDK源碼的幾個問題: 為什麼要看JDK源碼 JDK源碼的閱讀順序 JDK源碼的閱讀方法 為什麼要看JDK源碼 一,JDK源碼是其它所有源碼的 基礎 ,看懂了JDK源碼再看其它的源碼會達到事半功倍的效果。 二,JDK源碼中包含大量的 數據結構 知識,是學習 ...


簡介

大家好,我是彤哥,今天我想和大家再聊聊JDK源碼的幾個問題:

  • 為什麼要看JDK源碼

  • JDK源碼的閱讀順序

  • JDK源碼的閱讀方法

為什麼要看JDK源碼

一,JDK源碼是其它所有源碼的基礎,看懂了JDK源碼再看其它的源碼會達到事半功倍的效果。

二,JDK源碼中包含大量的數據結構知識,是學習數據結構很好的資料,比如,鏈表、隊列、散列表、紅黑樹、跳錶、桶、堆、雙端隊列等。

三、JDK源碼中包含大量的設計模式,是學習設計模式很好的資料,比如,適配器模式、模板方法模式、裝飾器模式、迭代器模式、代理模式、工廠模式、命令模式、狀態模式等。

三,JDK源碼中包含大量Java的高階知識,比如弱引用、Unsafe、CAS、鎖原理、偽共用等,不看源碼是很難學會這些知識的。

四,面試時更好地收割offer,這可能是很多同學最初的想法,其實真正看多了源碼,這一點可能並不是太重要了,因為你會發現更廣闊的世界。

五,彤哥認為最重要的,閱讀源碼是對思維的一種鍛煉,是學習優秀設計的最佳途徑,本文來源於工從號彤哥讀源碼。

JDK源碼的閱讀順序

首先,JDK源碼我分成了以下幾個部分:

基礎類

基礎類,是指組成JDK源碼地基的一部分類。

比如包裝類、反射類、工具類等,這些類有個共同點,就是代碼邏輯相對簡單,不存在數據結構、複雜運算等問題。

對於基礎類,彤哥的建議是自己從頭到尾瀏覽一遍,對於看不懂的地方可以寫測試用例或者上網查查資料。比如,Integer裡面有個IntegerCache內部類你可能不知道幹嘛的,這時候光看代碼是沒用的,只能上網查查資料了,也不能盲目地死磕。

簡單集合

簡單集合,是指不存在多線程安全問題的集合。

這部分集合一般用在單線程中,或者方法體中,但是他們用到了很多的數據結構,所以需要一定的數據結構知識。

對於簡單集合,彤哥的建議是先弄明白底層的數據結構知識,再去看源碼,這樣可能會輕鬆一些。當然,彤哥後面也會出數據結構系列的。

原子類

原子類,是指在多線程環境下能夠保證原子性的類。

這部分類主要包括Atomic*開頭和*Adder結尾的類,位於juc下麵的atomic包中。

對於原子類,彤哥的建議是先去瞭解底層的Unsafe、CAS、偽共用等概念,再去看最簡單的AtomicInteger,最後再看LongAdder這種複雜的類。其中,斷點調試是不可或缺的手段。

說句實話,LongAdder這個類能學到很多高階的知識,非常推薦把這個類研究透徹,後面再去看Disruptor、Netty等源碼會事半功倍。

同步器

同步器,是指為了控制多個線程的競爭關係而存在的類或者關鍵字等,本文來源於工從號彤哥讀源碼,它們可以說是Java中最重要的內容,沒有它們就無法控制多線程的正常運轉。

這部分內容主要包括synchronized關鍵字、volatile關鍵字、重入鎖、讀寫鎖、倒計時器、信號量、迴環柵欄、階段器、分散式鎖的實現等等。

對於同步器,彤哥的建議是先瞭解記憶體模型、可見性、原子性、有序性、Happens-Before等基本概念,再嘗試閱讀這部分的源碼,最後再歸納出屬於你自己理解的“同步器的原理”。

併發集合

併發集合,是指多線程環境下能夠保證數據一致性的集合。

這部分集合主要是運用在多線程環境下,只有極個別類牽涉到高級的數據結構,更多的是鎖、CAS、volatile、自旋等高階技巧的運用。

對於併發集合,彤哥的建議有三點:

  • 一定要在同步器之後閱讀

  • 數據結構先搞透,比如ConcurrentSkipList

  • 利用IDEA的Thread級別的斷點,不斷調試,不斷調試,不斷調試

線程(池)類

線程(池)類,是指跟線程和線程池相關的類。

這部分類主要包含Thread、ThreadLocal、三種線程池等。

對於線程(池)類,彤哥的建議是先從整體上把握,再分成幾個塊來看,看哪塊的東西就只看那塊的東西,不要管其它的代碼,即要搞清楚你的重點在哪裡,比如,看線程運行的流程就不要管狀態的事,凡是牽涉到狀態的代碼全部跳過,反之亦然,都看完了,再串一起看。

IO/NIO類

IO類,是指跟輸入輸出流相關的類,這部分類主要包括文件操作相關的類以及網路IO相關的類。

對於IO類,彤哥的建議是簡單瀏覽,做到心裡有數即可,用到的時候再去查都可以。

但是對於nio相關的類,還是要好好研究的,這部分類我們放在Netty源碼閱讀的相關章節中一起學習。

其它類

其它類,工作中遇到了可以點進去看看,但是不建議抽出時間單獨去研究,比如,時間類、awt類,看的必要性不是很大。

JDK源碼的閱讀方法

一,設定目標,目標越明確越好,不要設定得過於虛無縹緲。比如,熟悉HashMap的數據結構,這就是一個很明確的目標;再比如,看懂HashMap的源碼,這就很縹緲了。

二,嘗試自己提出問題,先自己根據某個知識點發散提出問題。比如,關於HashMap你能想到哪些知識點,這部分可以藉助思維導圖無限想象,後面有機會彤哥給大家分享一下思維導圖聯想法。

三,嘗試網路查詢問題,打開度娘,輸入你要學習的知識點,把前面幾頁統統點開,看看別人都遇到了哪些問題,當然,能力強的同學也可以使用Google,這部分查詢出來的問題也可以補充到你的思維導圖中去。

四,嘗試閱讀源碼,對於上面的問題,一個一個嘗試去源碼中尋找答案,由點及面,最後再總結整個大的知識點。

五,不斷發現問題,在閱讀源碼的過程中可能又會發現新的問題,先跳過去,而是把它加到思維導圖中,等當前的問題解決完了再去解決。

六,專註你的問題,在閱讀源碼的時候一定要專註於你當前的問題,不要受其它問題的干擾,比如看線程池任務執行的流程,你就不要管線程池狀態的事情。

七,多做比較,橫向比較和縱向比較,從多維度去比較,本文來源於工從號彤哥讀源碼。

八,多做實驗,多多利用IDE的調試模式,不斷修改斷點,不斷調試。

九,多與人交流,如果條件允許的話,多與周邊的人一起交流,當然,也可以來騷擾彤哥。

十,多做總結,對於自己解決的問題,一定要學會總結,多做學習筆記,當然,也歡迎來彤哥這裡投稿。

十一,耐心&堅持,閱讀源碼是一件非常枯燥而且枯燥的事情,一定要堅持堅持堅持。

總結

今天,我們聊了聊學習JDK源碼的幾個問題,不小心就寫了這麼多,都是肺腑之言,希望大家能收下我的膝蓋。

彩蛋

最後,送上一幅JDK源碼的思維導圖,標星是彤哥建議必看的部分,對於時間充足的同學,沒標星當然最好也看看。

關於JDK源碼的部分彤哥已經全部解析完畢,點擊公眾號彤哥讀源碼左下角“JDK源碼”可以查看所有源碼解析。

jdk_source


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 單例模式是老生常談的一種設計模式,同時它是最簡單也是最容易被忽視的一種設計模式。單例類應該是密封類,不能被繼承,同時建議在任何情況下都要保證線程安全。 ...
  • 5. 分散式事務解決方案之可靠消息最終一致性 5.1. 什麼是可靠消息最終一致性事務 可靠消息最終一致性方案是指當事務發起執行完全本地事務後併發出一條消息,事務參與方(消息消費者)一定能夠接收消息並處理事務成功,此方案強調的是只要消息發給事務參與方最終事務要達到一致。此方案是利用消息中間件完成,如下 ...
  • 從程式員到架構師的進階過程,就像是用時間精力澆灌培植一棵樹,讓小樹苗逐漸長成參天大樹,先有主幹,後有枝葉,待到枝繁葉茂就能開花結果了,也就是說等到架構師所需技能全都儲備好了,那我們就有信心勝任新崗位工作了。 ...
  • 本文主要學習如何在Windows環境中下載並安裝Tomcat伺服器。 ...
  • 由於這個是畢業設計的內容,而且還是跨專業的。爬蟲程式肯定是很簡單的,就是調用Yahoo的API進行爬取圖片。這篇博客主要講的是基礎的界面設計。 放上源碼,然後分部解析一下重要的地方。註:flickrapi需要翻牆 代碼複製的時候可能掉幾個字母或者符號,不建議複製代碼,如需複製請自行檢查是否有拼寫錯誤 ...
  • 線程間通信 概念:多個線程在處理同一個資源,但是處理的動作(線程的任務)卻不相同。 比如:線程A用來生成包子的,線程B用來吃包子的,包子可以理解為同一資源,線程A與線程B處理的動作,一個 是生產,一個是消費,那麼線程A與線程B之間就存線上程通信問題。 為什麼要處理線程間通信: 多個線程併發執行時, ...
  • 本文主要說明在Linux環境下JDK的安裝,以及安裝完成之後環境變數的配置。 ...
  • 1.X 到2.x後中間件定義的名字也有所不同 改一下就好了 在setting文件中將原先的 MIDDLEWARE_CLASS 改成MIDDLEWARE 如果還運行不成功 註釋掉標白線的那一行 刪掉也行, 因為2.0已經自帶它的功能,所以就棄用它了。 (吐槽一下:在一個項目沒做完時,最好不要換版本,各 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...