
前言
樓主自1月14號就停更了,這段時間一直在看JVM,因此沒有更新任何文章,但樓主覺得有必要總結(jié)一下之前學(xué)習(xí)并發(fā)的過程,因為這一次的總結(jié)其實就是下一次的開始。主要時總結(jié)一下并發(fā)的學(xué)習(xí)路線,因為在樓主的工作環(huán)境中,并不是每天都在編寫高并發(fā)的程序。然而,即使是這樣,我們也要知道并發(fā)的每個知識點,這樣才算一個合格的Java 程序員。那么如何系統(tǒng)的學(xué)習(xí)并發(fā)呢?學(xué)習(xí)路線是怎么樣的呢?
1. 學(xué)會開始就成功了一半
首先要確定的思想是:并發(fā)編程很復(fù)雜,不是看一兩篇博客就搞定的。樓主學(xué)習(xí)學(xué)習(xí)并發(fā)主要看了4本書:
- 《并發(fā)編程實戰(zhàn)》
- 《并發(fā)編程的藝術(shù)》
- 《Java 高并發(fā)程序設(shè)計》
- 《深入理解 Java 虛擬機》第五部分:高效并發(fā)

也就是上面的幾本書。還有一個建議就是,看書最好是看實體的,有什么好處呢?好處就是,當(dāng)你腦子里有一個疑惑的時候,你能夠立馬翻書去驗證你的想法。而不是打開電子書,慢慢找。不過也有很多人喜歡電子書,畢竟地鐵上看書不方便。具體買什么書可以根據(jù)自己的情況來。沒有最好的,只有最合適的。還有一個問題,就是,看書不一定是從頭到尾一字不漏的看,這和死讀書差不多。樓主的讀書經(jīng)驗是:先快速的將全書過一遍,大概會花一天時間,再找到自己感興趣的點慢慢看,慢慢配合代碼驗證。這樣效率會高一點。而且理解的會更加深刻。這也算一個學(xué)習(xí)的方法吧。
那么這四本書先看哪一個呢?樓主是先看的《Java 高并發(fā)程序設(shè)計》,國人寫的。相比較于其余的3本,通俗易懂。注意,看這本書的時候,一定要配合著書敲代碼。否則都是白瞎。
2. 逐漸深入
在看完了 《Java 高并發(fā)程序設(shè)計》 后和寫了一些 demo 后,我們應(yīng)該會基本的并發(fā)編程了,知道如何使用 JDK 中的 API,也知道了一些基本的 Java 內(nèi)存模型,一些關(guān)鍵字的理論。這個時候,我們僅僅是 How 的階段,也就是使用的階段。如果你是一個有追求的程序員,你肯定想深入了解并發(fā)中哪些奇怪的約定,奇怪的事情到底是如何發(fā)生的,那么,就需要繼續(xù)讀書,寫代碼。
這個時候,就需要看看《并發(fā)編程的藝術(shù)》和《深入理解 Java 虛擬機》第五部分:高效并發(fā),這兩本書,重點深入原理,配合 JVM 源碼和 匯編深入解釋并發(fā)的原理。讀起來酣暢淋漓。將之前的哪些困惑一掃而空。至于為什么看兩本,因為每本書都不是完美的,那些寫書的作者的觀點也會不同,因此,我們需要知道的更多,并對比他們的看法,才能更加深入的形成自己的思維模型。不能只跟著一本書走。
這兩本書主要是理論,但請注意,其中的理論我們可以用代碼來驗證,才能更深刻的加深印象。
3. 深入源碼
在了解了原理之后,我們只是得到了理論知識,但很虛無,如果你是個好奇貓,那么你肯定想知道這些設(shè)計是如何實現(xiàn)的。幸運的是,從 Java 源碼中,我們就能知道百分之90 了(剩下的在 HotSpot 源碼中)。這個時候我們做什么呢?
硬肛?。?!翻起我們之前寫的那些 demo,比如 new Thread(),new ConcurrentHashMap(),這些我們之前練習(xí)的 demo,配合我們的開發(fā)工具(強烈推薦 IDEA),鼠標左鍵 + ctrl,進入源碼查看如何實現(xiàn)。源碼重點在 java.util.concurrent 包下。這些都是并發(fā)大師 Doug Lea 的杰作。值得反復(fù)品味。當(dāng)然,看源碼的時候,也可以順帶結(jié)合源碼看看之前的書。加深印象。
只有看懂了源碼,你才能說,你真正知道了原理。
在看源碼的過程中,有痛苦,有快樂,起碼樓主是這樣的。痛苦的是:很多奇怪的地方看不懂??鞓返氖牵耗切┢婀值牡胤浇K于搞懂了。這就是編程的樂趣吧。像一個偵探,慢慢的解開所有的疑惑,最后找到真相。
為什么說硬肛呢?從短期來說,看源碼處理滿足好奇心,并不能給你帶來什么好處。如果看源碼不能給你帶來快樂,那么,很快,你就會堅持不下去,但是,請注意:這是你進階高級 Java 程序員的一個標志。
當(dāng)然,不是所有的源碼都是要看的。這時候就體現(xiàn)出 demo 的重要性了,如果你之前沒有 demo,那么你將無從下手。但是,如果你聽了樓主的:邊看書的同時也寫了demo,那么這個時候,你就可以順著demo看源碼了,有什么好處呢?好處就是:你從源碼層面了解了你使用的api的具體實現(xiàn)。從這個意義上說:你已經(jīng)學(xué)會并發(fā)編程了。
也許,經(jīng)過一到兩個月的閱讀源碼的過程,你對 JUC (java.util.concurrent)包下的 API 已經(jīng)了如執(zhí)掌,恭喜你,你終于學(xué)會了并發(fā)編程。不讀源碼,不足以談并發(fā)。
總結(jié)
通過上面的3個步驟,基本就能搞定 Java 并發(fā)編程,看這篇文章的你,可以算一下時間,樓主估算了一下,如果你是在職的,那么你需要在工作之余完成這件事情,大概需要2個多月,當(dāng)然這也要看你的 Java 基礎(chǔ)好不好了,這和平時的積累有很多關(guān)系。如果你是個天才,當(dāng)樓主沒說。但大部分人都是凡人,都是靠著堅持和努力才能達到自己的目標。所以,請努力吧!
最后,當(dāng)你看完了 JUC 的源碼,感覺還不過癮,HotSpot 的源碼等著你,夠你喝好久。因為樓主正在喝 HotSpot 的源碼。哈哈哈哈。