1. 程式人生 > >關於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原始碼聊聊如何高效閱讀

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

短視訊APP開發打造新聞資訊短視訊APP

現在,還有多少人喜歡看新聞了? 六十年代,新聞是人們看世界的唯一視窗,八十年代,看新聞是全家人的集體活動,現在,短視訊成了人們的手中寶,新聞,不是年輕人的範兒。 當抖音引爆全球,雞湯灌滿朋友圈,報紙逐漸退居幕後,甚至,近年來,一些蠢人開始不再相信新聞,他們認定它們是假的,朋友圈裡不知從哪兒拍

程式設計師用一段程式碼把眾人嚇一跳,網友把寫程式碼的打一頓

話不多說,直接上截圖: 這見過麼? 但是想不想來點刺激的。 有沒有哪些程式碼看到就很緊張?比如下面這個: 當有時候訪問人多的時候看到這段程式碼,驚不驚喜?!刺不刺激?!! 厲不厲害。驚不驚喜呢?哈哈 下面來看一下網友的反應: 萬一人家是伺服器分流之後返回

陣列B需要一艘船屋

Fred Mapper is considering purchasing some land in Louisiana to build his house on. In the process of investigating the land, he learned that the state of

(一)影象座標和世界座標談談(A) 【計算機視覺學習筆記--雙目視覺幾何框架系列】

     玉米竭力用輕鬆具體的描述來講述雙目三維重建中的一些數學問題。希望這樣的方式讓大家以一個輕鬆的心態閱讀玉米的《計算機視覺學習筆記》雙目視覺數學架構系列部落格。這個系列部落格旨在捋順一下已標定的雙目視覺中的數學主線。數學推導是有著幾分枯燥的,但奇妙的計算機視覺世界

學會了這套方法論,你就能高效解決問題(3)

解決問題的基本步驟 曲凱是四十二章經創始人,他在剛畢業做諮詢師的時候就有個疑問,他的那些客戶都是大公司的大老闆,都有很豐富的行業資源和經驗,為什麼要找他一個剛畢業的人幫他們解決問題呢? 後來他發現,大老闆們跟管理諮詢師最大的區別是,面對問題,大老闆們用的是經驗,而諮詢師有一套思維

學會了這套方法論,你就能高效解決問題(2)

解決問題的基本步驟 曲凱是四十二章經創始人,他在剛畢業做諮詢師的時候就有個疑問,他的那些客戶都是大公司的大老闆,都有很豐富的行業資源和經驗,為什麼要找他一個剛畢業的人幫他們解決問題呢? 後來他發現,大老闆們跟管理諮詢師最大的區別是,面對問題,大老闆們用的是經驗,而諮詢師有一套思維

學會了這套方法論,你就能高效解決問題(1)

解決問題的基本步驟 曲凱是四十二章經創始人,他在剛畢業做諮詢師的時候就有個疑問,他的那些客戶都是大公司的大老闆,都有很豐富的行業資源和經驗,為什麼要找他一個剛畢業的人幫他們解決問題呢? 後來他發現,大老闆們跟管理諮詢師最大的區別是,面對問題,大老闆們用的是經驗,而諮詢師有一套思維

如何在 Intellij IDEA 高效將應用部署到容器服務 Kubernetes

前言 在之前的一篇文章中,我們介紹了 如何將一個本地的 Java 應用程式直接部署到阿里雲 ECS ,有不少讀者反饋,如果目前已經在使用阿里雲容器服務 Kubernetes 了,那該如何配合這個外掛部署應用呢?在本文中,我們來介紹 部署應用程式到阿里雲容器服務 Kubernetes

EF性能優化-有人說EF性能低,EF確實不如ADO.NET

開發 rac tracking linq 好處 系統開發 ... span 執行 十年河東,十年河西,莫欺少年窮。 EF就如同那個少年,ADO.NET則是一位壯年。畢竟ADO.NET出生在EF之前,而EF所走的路屬於模仿ADO.NET。 也就是說:你所寫的LINQ查詢,最後

老男孩逆襲思想IT新手如何讓提問高效

逆襲 ima idt watermark cto style tex wid water 老男孩逆襲思想:IT新手如何讓提問更高效?老男孩逆襲思想:IT新手如何讓提問更高效?

素數序列的生成及其應用(采用了新學的高效的算法布爾標記法 + 倍數淘汰法)

lin ++ lse 大於 所有 void ont null -a 問題: 不超過2000的素數有哪些? 她的QQ號是素數嗎? 解決: 已知: 1不是素數 2是素數 大於2的偶數不是素數 大於2的素數是奇數 當自然數k > 1時,素數的k被數不是素數 策略:

程式猿離職帶走原始碼竟獲利800萬,網友一般都是刪庫跑路

程式猿辭職帶走自己寫的原始碼算違法嗎? 程式猿屬於特殊職業。正常來說,公司會與程式猿簽訂保密或全部權協議的。假設沒有簽訂,依照法理來推論,在工作期間全部製作或參與的程式碼都屬於公司財產,屬於工作內容範圍內的職責,未經公司許可帶走或拷貝是違法的。這種行為可有公司自訴也可由司法部分公訴。

JDK原始碼閱讀InterruptibleChannel與可中斷IO,ig牛逼

Java傳統IO是不支援中斷的,所以如果程式碼在read/write等操作阻塞的話,是無法被中斷的。這就無法和Thead的interrupt模型配合使用了。JavaNIO眾多的升級點中就包含了IO操作對中斷的支援。InterruptiableChannel表示支援中斷的Channel。我們常用的FileCha

高效安全地操作 CSSOM CSS Typed OM

前言 長期以來,我們要修改 DOM 元素的樣式,我們實際上操作的是 CSS 的物件模型 CSSOM。而 Houdini 中推進的又一組 CSS 物件模型 Typed OM,該標準又給我們帶來了什麼好處呢? CSSOM CSSOM 是幹嘛的? 簡單的說來,CSSOM 是一組能讓 JS 操作元素 CSS

AI應屆博士年薪漲到80萬 網友讀博士

圖片來源圖蟲:已授站長之家使用 站長之家(ChinaZ.com) 11月19日 訊息:近年來,AI持續火熱,巨頭們也紛紛佈局人工智慧。由於AI領域人才嚴重短缺,不少企業不斷提升待遇吸引人才。 據第一財經訊息,今年的AI人才需求依然旺盛。很多AI人才還未出校門,或尚未離職就已經被企業“搶

專訪百度熊輝有人轉AI純粹因為好找工作,這樣的人不是要的

2018 年初,學術界的明星人物,美國羅格斯-新澤西州立大學教授、ACM 傑出科學家、長江學者熊輝加盟百度,擔任百度商業智慧實驗室主任以及百度人才智庫主任。 從計算機博士到商學院教授,再從學術圈到工業界,熊輝一直在跨界。從加入百度到現在,熊輝已經帶領團隊拿下了管理界的最高獎項——哈佛商

JDK原始碼解讀(第五彈Integer之toString方法)

上一篇只講了Integer的幾個屬性,這一次我們來看一下toString方法。 toString總共有3個過載,先來看兩個引數的toStirng方法: public static String toString(int i, int radix) {

趣談網路協議---世界這麼大,出閘道器歐洲十國遊與玄奘西行

怎麼在宿舍上網? 學習給每隔宿舍的網口分配了一個IP地址。這個IP地址是校園網的IP,有網管部門控制。 宿舍上網有2個方法: 1、買個網絡卡。一張網絡卡的線插到交換機,另一張網絡卡的線插到校園網的網口。且新網絡卡的IP地址要按網管部門分配的配置。 2、買個家庭路

LoveEmperor_王子様找些強的敵人!

Linux下Tomcat8的安裝配置安裝tomcat前首先要安裝對應的jdk並配置Java環境。一、環境準備jdk版本:1.8工具:xShell5 xftp5說明:本文是通過Xshell5工具遠端連線Linux操作,原理一樣.二、安裝步驟1、下載安裝包官網下載地址:http: