如何評(píng)價(jià)《Java 并發(fā)編程藝術(shù)》這本書(shū)?
對(duì)于書(shū)評(píng)這件事情,我其實(shí)是不想寫(xiě)的,因?yàn)槊總€(gè)人都有自己的一個(gè)衡量標(biāo)準(zhǔn),每個(gè)人眼中都有自己的哈姆雷特,是好是壞每個(gè)人都褒貶不一。如果對(duì)于書(shū)中的知識(shí)你都掌握了,你只是想把它作為一種知識(shí)串聯(lián)的記憶體的話,那么你可能感興趣的是整本書(shū)的知識(shí)框架和體系脈絡(luò),所以如果書(shū)中的知識(shí)具有連貫性,能夠在你腦海中編織出你想要的記憶藍(lán)圖,那么我相信它對(duì)你來(lái)說(shuō)就沒(méi)那么好;如果你想把它作為打開(kāi)新世界的大門(mén),你想了解一下并發(fā)編程的奧妙,我相信它對(duì)你來(lái)說(shuō)也是一本好書(shū),能夠拓展你的知識(shí)深度;如果你是面向面試來(lái)看它,它也是一本好書(shū),因?yàn)榻^大多數(shù)知識(shí)都是面試的常考點(diǎn)。
下面我會(huì)來(lái)帶你過(guò)一遍這本書(shū)。
前置知識(shí)
首先先來(lái)混個(gè)臉熟,我相信大家都不陌生了,上書(shū)!!!

首先,這本書(shū)是由三個(gè)人撰寫(xiě)的,這三位都是阿里人,我用一幅圖來(lái)說(shuō)明這三個(gè)人都寫(xiě)了哪些內(nèi)容。

如果是由三個(gè)人合力撰寫(xiě)的一本書(shū),如果不能做到對(duì)書(shū)整體脈絡(luò)有把控的話,就會(huì)陷入聾子聽(tīng)啞巴說(shuō)瞎子看見(jiàn)鬼了這種邏輯上不能自洽的局面,但是我能從書(shū)中看出來(lái),出版社和方老師在對(duì)整體知識(shí)體系的脈絡(luò)上面做到了嚴(yán)格把控,但我認(rèn)為還是差點(diǎn)。
謹(jǐn)言慎行,我會(huì)盡量做到以極其客觀的角度來(lái)解讀這本書(shū)。
首先第一章并發(fā)編程的挑戰(zhàn)這個(gè)立意非常不錯(cuò),把整本書(shū)所講的主要內(nèi)容先引出來(lái),使讀者大致了解一下并發(fā)編程都會(huì)帶來(lái)哪些問(wèn)題,然后切入并發(fā)編程的痛點(diǎn),即并發(fā)編程的性能瓶頸。
然后第二章直接深入 Java 并發(fā)機(jī)制的底層實(shí)現(xiàn),這一章的內(nèi)容和深度我認(rèn)為有待商榷,但是如果從精讀的角度來(lái)看,這并沒(méi)有什么不妥,同時(shí)也會(huì)對(duì)那些"有一定 Java 并發(fā)編程基礎(chǔ),想要更深層次了解 Java 并發(fā)底層實(shí)現(xiàn)"的同學(xué)來(lái)說(shuō),很容易眼前一亮。但是對(duì)那些"還沒(méi)接觸過(guò)并發(fā)編程,只想要了解一下 Java 并發(fā)"的同學(xué)來(lái)說(shuō),這第二章直接勸退了,說(shuō)實(shí)話我在剛開(kāi)始的時(shí)候接觸這本書(shū),看到第二章我直接墊顯示器了。
所以這就是一個(gè)選擇的問(wèn)題,這個(gè)問(wèn)題深層次的拷問(wèn)就是:你到底想給什么樣的讀者呈現(xiàn)什么樣的內(nèi)容?
然后我們假定第一種情況,即"有一定 Java 并發(fā)編程基礎(chǔ),想要更深層次了解 Java 并發(fā)底層實(shí)現(xiàn)"的這類同學(xué),這類同學(xué)看到這里我相信會(huì)直接喊出 yyds 這個(gè)詞,因?yàn)檫@一章真的非常驚艷,能夠?qū)懗鲞@樣的內(nèi)容得益于方老師百年如一日的堅(jiān)持和長(zhǎng)期在一線打拼的知識(shí)積累。第一章和第二章的銜接就像是你剛學(xué)會(huì)了 1 + 1 = 1,然后就讓你論證為什么 1 + 1 = 1 ?
社死了有木有???????
第二章直接帶我們上難度,從 volatile 講到 synchronized ,從對(duì)象頭講到鎖的升級(jí)降級(jí)(撤銷),從 CAS 講到 ABA,從原子操作講到內(nèi)存屏障,我直呼好家伙!非常驚艷。
但是,第二章對(duì)于一些細(xì)節(jié)的打磨還是差了一些,比如說(shuō)在鎖升級(jí)這塊的流程圖就畫(huà)的不是那么顯而易見(jiàn),反正我是看了圖,然后結(jié)合了大量網(wǎng)上的參考才看的略知一二。還有就是方老師上來(lái)直接講應(yīng)用和底層原理,都沒(méi)有前戲的嗎???volatile 是什么,怎么我認(rèn)為也應(yīng)該從一個(gè)簡(jiǎn)單的小例子引出來(lái)吧。
然后第三章,切換選手,上來(lái)直接全程硬菜,這一章從內(nèi)存模型入手,講了 volatile 、final、synchronized 的內(nèi)存語(yǔ)意,as-if-serial 和 happens-before 原則,Java 內(nèi)存模型是怎樣的以及 JSR-133 對(duì)內(nèi)存模型做了哪些改變,可以說(shuō)能介紹的都介紹完了。
但是,我又要說(shuō)但是了,這一章有一些內(nèi)容應(yīng)該是從外文網(wǎng)站上翻譯出來(lái)的,很多地方有些生硬,感覺(jué)像是堆砌,不像是在講課。這種講解風(fēng)格我認(rèn)為不如方老師講的犀利,能夠直接切入重點(diǎn)。這一章我剛開(kāi)始看的還行,但是到了這一章后半程,明顯感覺(jué)吃力,不知道是我菜還是怎么著,看著看著明顯犯困,不知道手機(jī)/電腦前的小伙伴們?cè)趺凑J(rèn)為的。
擼完第三章,再看第四章,就感覺(jué)有點(diǎn)虐小號(hào)的意思,為什么 Java 并發(fā)編程基礎(chǔ)放在第四章講??????為什么基礎(chǔ)要放在底層實(shí)現(xiàn)的后面??????這不是本末倒置嗎?如果你是先看目錄直接從第四章看起來(lái)的倒還好,如果你從第一章慢慢慢慢看到第四章,你很可能會(huì)懷疑人生,這是什么破玩意?真的沒(méi)有搞明白為什么基礎(chǔ)要放在第四章才開(kāi)始講。而且第四章這部分內(nèi)容很多都是一帶而過(guò),讓我不得不懷疑這位選手應(yīng)該沒(méi)怎么寫(xiě)過(guò)文章,我身邊這些公眾號(hào)主,但凡做的好的,有一些流量的原創(chuàng)號(hào)主,都不可能把文章寫(xiě)成這樣,大量的代碼堆砌,講解一帶而過(guò),這著實(shí)沒(méi)什么用,真的建議作者把《Java并發(fā)編程實(shí)戰(zhàn)》再好好讀一讀。
看到第五章,我終于明白了沒(méi)有點(diǎn) Java 并發(fā)基礎(chǔ)的話,最好不要看這本書(shū),因?yàn)楹苋菀最^大。
第六章到第十一章其實(shí)講解的有些過(guò)于基礎(chǔ)了,如果說(shuō)這本書(shū)是想要帶讀者深入理解并發(fā)的話,書(shū)中并沒(méi)有涉及很多源碼,但是對(duì)于那些"還沒(méi)接觸過(guò)并發(fā)編程,只想要了解一下 Java 并發(fā)"的同學(xué)來(lái)說(shuō),卻是一個(gè)了解 Java 并發(fā)一個(gè)比較好的工具書(shū)和參考書(shū),對(duì)于那些希望面試背題的同學(xué)來(lái)說(shuō)也是一樣的。
面試的時(shí)候一般會(huì)分為四個(gè)階段來(lái)問(wèn):
你知道 xxx 嗎?你用過(guò) xxx 嗎?(一問(wèn)看你有沒(méi)有接觸過(guò),一般沒(méi)接觸過(guò)就不會(huì)問(wèn)這個(gè)方向了) 你在日常開(kāi)發(fā)的過(guò)程中是如何使用 xxx 的呢?(再次判斷你有沒(méi)有接觸過(guò),如果你能回答上來(lái)應(yīng)用場(chǎng)景,才會(huì)繼續(xù)向下問(wèn),不然面試官就認(rèn)為你在扯皮) 那你知道 xxx 的原理嗎?(問(wèn)你原理就是判斷你私下來(lái)有沒(méi)有研究過(guò)這個(gè)東西,可以回答 xxx 的工作機(jī)制是怎樣的,比如線程池的原理,你就可以回答線程池的工作機(jī)制) 最后還可能會(huì)問(wèn)你更細(xì)一些的問(wèn)題,比如 HashMap 的 put 過(guò)程是怎樣的?(這個(gè)就需要熟悉源碼了)
所以,這本書(shū)給大家?guī)?lái)的知識(shí)點(diǎn)僅局限于前三點(diǎn),事實(shí)上,從整個(gè)行業(yè)上來(lái)說(shuō),我也沒(méi)有看到哪位作者把源碼擼出來(lái)寫(xiě)成一本書(shū)的,所以這也是我們程序員們努力的方向。
這里,給讀者朋友們推薦一下我寫(xiě)的關(guān)于并發(fā)方面的文章:
我真不想學(xué) happens - before 了!
cxuan 連這 10 個(gè)問(wèn)題都不會(huì)...
有解釋,有源碼,有案例,是不是要來(lái)學(xué)習(xí)一波?

為什么說(shuō)這本書(shū)好?
所以,為什么說(shuō)這本書(shū)好呢?
因?yàn)檫@本書(shū)符合我們中國(guó)人的調(diào)性,畢竟是出自中國(guó)人之手,這本書(shū)不同于《Java 并發(fā)編程實(shí)戰(zhàn)》,Java 并發(fā)編程實(shí)戰(zhàn)更多注重的是"如何編寫(xiě)一手優(yōu)秀的并發(fā)代碼",而 《Java 并發(fā)編程的藝術(shù)》更多的是圍繞 Java 底層知識(shí)來(lái)講解的,他們的側(cè)重點(diǎn)不同。并發(fā)編程實(shí)戰(zhàn)畢竟是外國(guó)人寫(xiě)的,它經(jīng)過(guò)翻譯的過(guò)程會(huì)損失掉一些原書(shū)的魅力,所以大家盡量還是要看原版書(shū),最好不要穿二手鞋。
Java 并發(fā)編程的藝術(shù)還好在比較貼合現(xiàn)如今的面試氛圍,大家知道現(xiàn)在面試就是各種八股文一股腦直接沖,這種面試造火箭的面試方式我們大家都嗤之以鼻,但是又無(wú)力改變這種現(xiàn)狀,所以只能適應(yīng),而這本書(shū)就是一個(gè)讓你更好適應(yīng)八股文面試的一本書(shū)。我上面說(shuō),這本書(shū)有幾個(gè)章節(jié)講的還是比較不錯(cuò)的,這幾個(gè)章節(jié)搞懂了,基本上相關(guān)面試你十拿九穩(wěn)。但是后面有一些章節(jié)比較淺顯,需要貼合網(wǎng)上的博客再詳細(xì)了解。
為什么說(shuō)這本書(shū)不好?
為什么說(shuō)這本書(shū)不好?
我不認(rèn)可這本書(shū)的敘述方式和體系結(jié)構(gòu),很容易把人給勸退。我認(rèn)為這是需要反思的一點(diǎn)。
而且阿里的同學(xué)作為業(yè)界尤其是 Java 技術(shù)棧的頂級(jí)程序員,如果不能把自己的技術(shù)棧和知識(shí)體系的完備性作為最高標(biāo)準(zhǔn)要求自己,那么我們普通程序員還能夠相信誰(shuí)呢?
這本書(shū)讓我有一種能夠離開(kāi)它但卻離不開(kāi)它的一種感覺(jué)。我看《深入理解 Java 虛擬機(jī)》的時(shí)候,就沒(méi)有這種情愫。因?yàn)榭赐曛芾蠋煹纳钊肜斫?JVM 之后,我甚至覺(jué)得 《Java 虛擬機(jī)規(guī)范》你就完全可以扔在一邊了。
但是,《Java 并發(fā)編程實(shí)戰(zhàn)》和 《Java 并發(fā)編程藝術(shù)》其實(shí)是一種互補(bǔ)品,缺少哪一本書(shū)的知識(shí),我都覺(jué)得少點(diǎn)東西。但是只看 Java 并發(fā)編程藝術(shù)這一本書(shū)又不夠,所以。。。。。。為什么不再認(rèn)真打磨一下呢?
所以,希望還能有下一版的《Java 并發(fā)編程藝術(shù)》,讓我們大家一起期待。
完
往期推薦
??
我真不想學(xué) happens - before 了!

