本文主要內容摘自加多大神的《Java併發編程之美》的前言內容,講了爲何要看源碼和如何看源碼,講的很精煉。這部分是屬於源碼學習方面的方法論,因此單獨摘錄下來而且總結。編程
咱們在作項目的時候通常會遇到下面的問題:設計模式
對於這些問題,說到底主要仍是由於經驗不夠,而經驗主要從項目實踐中積累,因此招聘單位通常都會限定工做時間大於3年,由於這些人的項目經驗相對較豐富,在項目中遇到的場景相對較多。工做經驗的積累來自於年限與實踐,然而看源碼能夠擴展咱們的思路,這是變相增長咱們經驗的不錯方法。雖然不能在短期內經過時間積累經驗,可是能夠經過學習開源框架、開源項目來獲取經驗。多線程
另外,進職場後通常都要先熟悉現有系統,若是有文檔還好,沒文檔的話就得本身去翻代碼研究。若是以前對閱讀源碼有經驗,那麼在研究新系統的代碼邏輯時就不會那麼費勁了。架構
還有一點就是,當你使用框架或者工具作開發時,若是你對它的實現有所瞭解,就能最大化地減小出故障的可能。好比並發隊列ArrayBlockingQueue裏面關於元素入隊有個offer方法和put方法,雖然某個時間點你知道使用offer方法時,當隊列滿了就會丟棄要入隊的元素,以後offer方法會返回false,而不會阻塞當前線程;而使用put方法時,當隊列滿了,則會掛起當前線程,直到隊列有空閒,元素入隊成功後才返回。可是人是善忘的,一段時間不使用,就會忘記它們的區別,當你再去使用時,需進入offer和put方法的內部,看它們的源碼實現。進入offer方法一看,哦,原來隊列滿後直接返回了false;進入put方法一看,哦,原來隊列滿後,直接使用條件變量的await方法掛起了當前線程。知道了它們的區別,你就能夠根據本身的需求來選擇了。併發
看源碼最大的好處是能夠開闊思惟,提高架構設計能力。有些東西僅靠書本和本身思考是很難學到的,必須經過看源碼,看別人如何設計,而後思考爲什麼這樣設計才能領悟到。框架
能力的提升不在於你寫了多少代碼,作了多少項目,而在於給你一個業務場景時,你是否能拿出幾種靠譜的解決方案,而且說出各自的優缺點。而如何才能拿出來,一來靠經驗,二來靠概括總結,而看源碼能夠快速增長你的經驗。工具
爲何看源碼呢:學習
那麼如何閱讀源碼呢?線程
在你看某一個框架的源碼前,先去Google查找這個開源框架的官方介紹,經過資料瞭解該框架有幾個模塊,各個模塊是作什麼的,之間有什麼聯繫,每一個模塊都有哪些核心類,在閱讀源碼時能夠着重看這些類。架構設計
而後對哪一個模塊感興趣就去寫個小demo,先了解一下這個模塊的具體做用,而後再debug進入看具體實現。
在debug的過程當中,第一遍是蜻蜓點水,簡略看一下調用邏輯,都用了哪些類;第二遍需有重點地debug,看看這些類擔任了架構圖裏的哪些功能,使用了哪些設計模式。
若是第二遍有感受了,便大體知道了總體代碼的功能實現,可是對總體代碼結構還不是很清晰,畢竟代碼裏面多個類來回調用,很容易遺忘當前斷點的來處;
那麼你能夠進行第三遍debug,這時候你最好把主要類的調用時序圖以及類圖結構畫出來,等畫好後,再對着時序圖分析調用流程,就能夠清楚地知道類之間的調用關係,而經過類圖能夠知道類的功能以及它們相互之間的依賴關係。 另外,開源框架裏面每一個功能類或者方法通常都有註釋,這些註釋是一手資料,好比JUC包裏的一些併發組件的註釋,就已經說明了它們的設計原理和使用場景。
在閱讀源碼時,最好畫出時序圖和類圖,由於人老是善忘的。若是隔一段時間你再去看以前看過的源碼,雖然有些印象,但當你想去看某個模塊的邏輯時,又需根據demo再從頭debug了。而若是有了這倆圖,就能夠從這倆圖裏面直接找,而且看一眼時序圖就知道整個模塊的脈絡了。
此外,查框架使用說明最好去官網查(這些信息是源頭,是沒有通過別人翻譯的),雖然是英文,可是看久了就行了,畢竟還有Google翻譯吶!
固然研究代碼時不必定非要debug三遍,其實這裏說的是三種掌握程度,若是你debug一遍就能掌握,那天然更好啦。
如何閱讀源碼:
注意的點: