官术网_书友最值得收藏!

前言

本書特色

不像其他并發類書籍那樣晦澀難懂,本書的特色之一是通俗易懂,對Java有一定基礎的開發人員都可以看懂。本書在基礎篇專門講解并發編程基礎,筆者根據在項目實踐中對這些知識的理解,總結了并發編程中常用的基礎知識以及常用的概念,并通過圖文結合的方式降低理解的難度,使用少量的代碼講解就可以讓讀者輕松掌握并發編程的基礎知識,讓讀者逐步建立起自信。在高級篇主要講解JUC并發包下并發組件的實現原理,首先介紹JUC里面最簡單的原子類,讓讀者學會使用在基礎篇里介紹的最簡單的CAS操作,再逐步加大難度讓讀者慢慢適應:比如一開始打算把并發List放到鎖后面講解,因為并發List里面使用了鎖,但是鎖的理解難度比List大太多,所以最終還是堅持從易入難的原則,先講解List,再講解鎖。在實踐篇中首先講解并發組件在開源框架或者項目中的運用,讓讀者不僅可以知道并發組件的原理,而且可以了解怎么使用這些組件。最后總結筆者在項目中或者其他同事在項目中經常遇到的并發編程問題,并對其進行分析,給出解決方案。

如果你只想使用并發包,那么可以閱讀本書,因為本書在講解代碼時基本都是用的實例;如果你想研究源碼卻一籌莫展——不知道如何下手或者感覺吃力,也可以閱讀本書,因為本書對核心代碼進行了講解;如果你想了解并發編程中的常見問題,增加對并發的認識,也可以閱讀本書,因為本書對這類問題進行了總結。

如何閱讀本書

本書分為基礎篇、高級篇和實踐篇,其中基礎篇講解線程的知識和并發編程中的基本概念以及基礎知識,高級篇則介紹并發包下常用的并發組件的原理,實踐篇講解并發組件的具體使用方法和在并發編程中會遇到的一些并發問題及解決方法。

閱讀開源框架源碼的一點心得

為什么要看源碼

我們在做項目的時候一般會遇到下面的問題:

(1)不知道如何去設計。比如剛入職場時,來一個需求需做概要設計,不知如何下手,不得不去看當前系統類似需求是如何設計的,然后仿照去設計。

(2)設計的時候,考慮問題不周全。相比職場新手,這類人對一個需求依靠自己的經驗已經能夠拿出一個概要設計,但是設計中經常會遺漏一些異常細節,比如使用多線程有界隊列執行任務,遇到機器宕機了,如果隊列里面的任務不存盤的話,那么機器下次啟動的時候這些任務就丟失了。

對于這些問題,說到底主要還是因為經驗不夠,而經驗主要從項目實踐中積累,所以招聘單位一般都會限定工作時間大于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一遍就能掌握,那自然更好啦。

主站蜘蛛池模板: 绥德县| 贞丰县| 清镇市| 呼图壁县| 太仓市| 昂仁县| 漳平市| 万山特区| 永吉县| 万宁市| 绥化市| 罗定市| 蓝田县| 广灵县| 北流市| 越西县| 镇康县| 兴海县| 康保县| 江川县| 喜德县| 田林县| 如东县| 张家口市| 布尔津县| 大荔县| 茂名市| 连云港市| 元朗区| 商南县| 静宁县| 延津县| 板桥市| 昌黎县| 庆云县| 柞水县| 昌图县| 隆化县| 宁阳县| 威信县| 乌海市|