你們好,我是彤哥,今天我想和你們再聊聊JDK源碼的幾個問題:面試
一,JDK源碼是其它全部源碼的基礎,看懂了JDK源碼再看其它的源碼會達到事半功倍的效果。設計模式
二,JDK源碼中包含大量的數據結構知識,是學習數據結構很好的資料,好比,鏈表、隊列、散列表、紅黑樹、跳錶、桶、堆、雙端隊列等。安全
3、JDK源碼中包含大量的設計模式,是學習設計模式很好的資料,好比,適配器模式、模板方法模式、裝飾器模式、迭代器模式、代理模式、工廠模式、命令模式、狀態模式等。網絡
三,JDK源碼中包含大量Java的高階知識,好比弱引用、Unsafe、CAS、鎖原理、僞共享等,不看源碼是很難學會這些知識的。數據結構
四,面試時更好地收割offer,這多是不少同窗最初的想法,其實真正看多了源碼,這一點可能並非過重要了,由於你會發現更廣闊的世界。多線程
五,彤哥認爲最重要的,閱讀源碼是對思惟的一種鍛鍊,是學習優秀設計的最佳途徑,本文來源於工從號彤哥讀源碼。併發
首先,JDK源碼我分紅了如下幾個部分:app
基礎類,是指組成JDK源碼地基的一部分類。分佈式
好比包裝類、反射類、工具類等,這些類有個共同點,就是代碼邏輯相對簡單,不存在數據結構、複雜運算等問題。工具
對於基礎類,彤哥的建議是本身從頭至尾瀏覽一遍,對於看不懂的地方能夠寫測試用例或者上網查查資料。好比,Integer裏面有個IntegerCache內部類你可能不知道幹嗎的,這時候光看代碼是沒用的,只能上網查查資料了,也不能盲目地死磕。
簡單集合,是指不存在多線程安全問題的集合。
這部分集合通常用在單線程中,或者方法體中,可是他們用到了不少的數據結構,因此須要必定的數據結構知識。
對於簡單集合,彤哥的建議是先弄明白底層的數據結構知識,再去看源碼,這樣可能會輕鬆一些。固然,彤哥後面也會出數據結構系列的。
原子類,是指在多線程環境下可以保證原子性的類。
這部分類主要包括Atomic*開頭和*Adder結尾的類,位於juc下面的atomic包中。
對於原子類,彤哥的建議是先去了解底層的Unsafe、CAS、僞共享等概念,再去看最簡單的AtomicInteger,最後再看LongAdder這種複雜的類。其中,斷點調試是不可或缺的手段。
說句實話,LongAdder這個類能學到不少高階的知識,很是推薦把這個類研究透徹,後面再去看Disruptor、Netty等源碼會事半功倍。
同步器,是指爲了控制多個線程的競爭關係而存在的類或者關鍵字等,本文來源於工從號彤哥讀源碼,它們能夠說是Java中最重要的內容,沒有它們就沒法控制多線程的正常運轉。
這部份內容主要包括synchronized關鍵字、volatile關鍵字、重入鎖、讀寫鎖、倒計時器、信號量、迴環柵欄、階段器、分佈式鎖的實現等等。
對於同步器,彤哥的建議是先了解內存模型、可見性、原子性、有序性、Happens-Before等基本概念,再嘗試閱讀這部分的源碼,最後再概括出屬於你本身理解的「同步器的原理」。
併發集合,是指多線程環境下可以保證數據一致性的集合。
這部分集合主要是運用在多線程環境下,只有極個別類牽涉到高級的數據結構,更多的是鎖、CAS、volatile、自旋等高階技巧的運用。
對於併發集合,彤哥的建議有三點:
線程(池)類,是指跟線程和線程池相關的類。
這部分類主要包含Thread、ThreadLocal、三種線程池等。
對於線程(池)類,彤哥的建議是先從總體上把握,再分紅幾個塊來看,看哪塊的東西就只看那塊的東西,不要管其它的代碼,即要搞清楚你的重點在哪裏,好比,看線程運行的流程就不要管狀態的事,凡是牽涉到狀態的代碼所有跳過,反之亦然,都看完了,再串一塊兒看。
IO類,是指跟輸入輸出流相關的類,這部分類主要包括文件操做相關的類以及網絡IO相關的類。
對於IO類,彤哥的建議是簡單瀏覽,作到內心有數便可,用到的時候再去查均可以。
可是對於nio相關的類,仍是要好好研究的,這部分類咱們放在Netty源碼閱讀的相關章節中一塊兒學習。
其它類,工做中遇到了能夠點進去看看,可是不建議抽出時間單獨去研究,好比,時間類、awt類,看的必要性不是很大。
一,設定目標,目標越明確越好,不要設定得過於虛無縹緲。好比,熟悉HashMap的數據結構,這就是一個很明確的目標;再好比,看懂HashMap的源碼,這就很縹緲了。
二,嘗試本身提出問題,先本身根據某個知識點發散提出問題。好比,關於HashMap你能想到哪些知識點,這部分能夠藉助思惟導圖無限想象,後面有機會彤哥給你們分享一下思惟導圖聯想法。
三,嘗試網絡查詢問題,打開度娘,輸入你要學習的知識點,把前面幾頁通通點開,看看別人都遇到了哪些問題,固然,能力強的同窗也可使用Google,這部分查詢出來的問題也能夠補充到你的思惟導圖中去。
四,嘗試閱讀源碼,對於上面的問題,一個一個嘗試去源碼中尋找答案,由點及面,最後再總結整個大的知識點。
五,不斷髮現問題,在閱讀源碼的過程當中可能又會發現新的問題,先跳過去,而是把它加到思惟導圖中,等當前的問題解決完了再去解決。
六,專一你的問題,在閱讀源碼的時候必定要專一於你當前的問題,不要受其它問題的干擾,好比看線程池任務執行的流程,你就不要管線程池狀態的事情。
七,多作比較,橫向比較和縱向比較,從多維度去比較,本文來源於工從號彤哥讀源碼。
八,多作實驗,多多利用IDE的調試模式,不斷修改斷點,不斷調試。
九,多與人交流,若是條件容許的話,多與周邊的人一塊兒交流,固然,也能夠來騷擾彤哥。
十,多作總結,對於本身解決的問題,必定要學會總結,多作學習筆記,固然,也歡迎來彤哥這裏投稿。
十一,耐心&堅持,閱讀源碼是一件很是枯燥並且枯燥的事情,必定要堅持堅持堅持。
今天,咱們聊了聊學習JDK源碼的幾個問題,不當心就寫了這麼多,都是肺腑之言,但願你們能收下個人膝蓋。
最後,送上一幅JDK源碼的思惟導圖,標星是彤哥建議必看的部分,對於時間充足的同窗,沒標星固然最好也看看。
關於JDK源碼的部分彤哥已經所有解析完畢,點擊公衆號彤哥讀源碼左下角「JDK源碼」能夠查看全部源碼解析。