如何閱讀原始碼?
萬事開頭難,原始碼從哪裡開始看?我也是剛對原始碼的閱讀研究不深,但是可以談談自己的原始碼閱讀感受。剛開始吧,只是對某些程式碼的實現原理感到好奇,好奇是怎麼實現這種功能,實現這種效果的,對其背後的原理充滿了求知慾。然後藉助 IDEA 以及翻譯外掛(本人英語桐油罐子,但這不影響我對原理的探索)一步步檢視原始碼,除錯,但是像無頭蒼蠅一樣不知道哪裡是重點,也就很難去理解原始碼的思想。
後來原始碼看多了,稍微有些經驗了,就知道應該首先了解這項技術的基本原理(可以去百度、看部落格),然後通過 IDEA 檢視它的繼承關係,有哪些構造方法,都有些什麼引數。再然後通過它主要的方法一步步深入瞭解,只是瞭解無需做底層的深入研究。當了解它的基本架構後,再針對某一塊程式碼深入探索,這樣既能把握整個技術的基本架構,對於深入研究也是很有好處的。
比如 RocketMQ 中介軟體
比如現在我想了解 RocketMQ 的技術底層,那麼首先我得知道它是用來幹嘛的,瞭解一下它的基本架構原理。MQ 嘛,訊息中介軟體,都需要路由、訊息伺服器這些基本元件。其本質上也是通過指令碼啟動的一個 java 程式,那麼我就可以通過這個啟動指令碼作為入口,去探索 RocketMQ 是如何啟動、提供服務的。
通過研究它的啟動類,發現是讀取了配置,做了一些初始化的操作。像這樣我就知道了 RocketMQ 是如何啟動的,然後再探索它初始化了一些什麼東西,比如它有一堆執行緒池、一些儲存服務、網路服務。通過這些就能一步步深入瞭解它實現某些功能的原理,比如說 RocketMQ 的海量儲存原理、支援高併發的原理。按照這種步驟,通過閱讀 RocketMQ 的原始碼,一步步的瞭解其架構原理。
比如執行緒池
再比如我想了解執行緒池的技術底層,首先我知道,執行緒池嘛,裡面有很多執行緒用來處理任務嘛,這就是我對執行緒池最原始的理解。在我還不會用的時候,我去網上搜尋執行緒池這個技術,發現一大堆的教程啊、遇到什麼什麼 bug 的解決方法啊、要不就是 jdk 預備的那幾個執行緒池的描述、使用啊。而把執行緒池這個東西說清楚的很少,讓人感覺都很有道理,但是對自己好像一點用都沒有。
所以嘛,要講究方法。既然要了解執行緒池這項技術的原理,首先要知道什麼是執行緒池(現在已經知道啦),然後有哪些執行緒池(JDK預備的、自定義的),再就是各個執行緒池有什麼區別,然後首先得用起來,比如寫幾個 demo 玩玩。順便淺顯的瞭解下他們的實現,發現他們都是使用的 ThreadPoolExecutor 實現的,然後自定義也是 ThreadPoolExecutor 實現的,既然如此 ThreadPoolExecutor 就是執行緒池的重點,那麼 ThreadPoolExecutor 就是我學習執行緒池原理的突破口。
首先使用 IDEA 檢視它的繼承關係、建構函式、類屬性等,然後從我使用執行緒池的時候,使用的 execute 方法作為了解其原理的入口,然後帶著自己的疑問去深入探索。比如執行緒池這個池子怎麼儲存執行緒的?原來線上程池內部,執行緒被包裝成了 Worker 物件,然後把 Worker 物件放在 HashSet 集合中,所以執行緒池實際上就是一個基於 Worker 物件的 Set 集合,然後所有的執行緒操作都是基於 Worker 物件進行操作的。順著這種思路去了解執行緒池的原理,比之前無腦亂入要好很多了。