關於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: