如何評價《Java 併發程式設計藝術》這本書?

程式設計師cxuan發表於2021-08-13

對於書評這件事情,我其實是不想寫的,因為每個人都有自己的一個衡量標準,每個人眼中都有自己的哈姆雷特,是好是壞每個人都褒貶不一。如果對於書中的知識你都掌握了,你只是想把它作為一種知識串聯的記憶體的話,那麼你可能感興趣的事整本書的知識框架和體系脈絡,所以如果書中的知識具有連貫性,能夠在你腦海中編織出你想要的記憶藍圖,那麼我相信它對你來說就沒那麼好;如果你想把它作為開啟新世界的大門,你想了解一下併發程式設計的奧妙,我相信它對你來說也是一本好書,能夠擴充你的知識深度;如果你是面向面試來看它,它也是一本好書,因為絕大多數知識都是面試的常考點。

下面我會從上面的幾個假如來帶你過一遍這本書。

前置知識

首先先來混個臉熟,我相信大家都不陌生了,上書!!!

首先,這本書是由三個人撰寫的,這三位都是阿里人,我用一幅圖來說明這三個人都寫了哪些內容。

如果是由三個人合力撰寫的一本書,如果不能做到對書整體脈絡有把控的話,就會陷入聾子聽啞巴說瞎子看見鬼了這種邏輯上不能自洽的局面,但是我能從書中看出來,出版社和方老師在對整體知識體系的脈絡上面做到了嚴格把控,但我認為還是差點。

謹言慎行,我會盡量做到以極其客觀的角度來解讀這本書

首先第一章併發程式設計的挑戰這個立意非常不錯,把整本書所講的主要內容先引出來,使讀者大致瞭解一下併發程式設計都會帶來哪些問題,然後切入併發程式設計的痛點,即併發程式設計的效能瓶頸。

然後第二章直接深入 Java 併發機制的底層實現,這一章的內容和深度我認為有待商榷,但是如果從精讀的角度來看,這並沒有什麼不妥,同時也會對那些"有一定 Java 併發程式設計基礎,想要更深層次瞭解 Java 併發底層實現"的同學來說,很容易眼前一亮。但是對那些"還沒接觸過併發程式設計,只想要了解一下 Java 併發"的同學來說,這第二章直接勸退了,說實話我在剛開始的時候接觸這本書,看到第二章我直接墊顯示器了。

所以這就是一個選擇的問題,這個問題深層次的拷問就是:你到底想給什麼樣的讀者呈現什麼樣的內容

然後我們假定第一種情況,即"有一定 Java 併發程式設計基礎,想要更深層次瞭解 Java 併發底層實現"的這類同學,這類同學看到這裡我相信會直接喊出 yyds 這個詞,因為這一章真的非常驚豔,能夠寫出這樣的內容得益於方老師百年如一日的堅持和長期在一線打拼的知識積累。第一章和第二章的銜接就像是你剛學會了 1 + 1 = 1,然後就讓你論證為什麼 1 + 1 = 1 ?

社死了有木有???????

第二章直接帶我們上難度,從 volatile 講到 synchronized ,從物件頭講到鎖的升級降級(撤銷),從 CAS 講到 ABA,從原子操作講到記憶體屏障,我直呼好傢伙!非常驚豔。

但是,第二章對於一些細節的打磨還是差了一些,比如說在鎖升級這塊的流程圖就畫的不是那麼顯而易見,反正我是看了圖,然後結合了大量網上的參考才看的略知一二。還有就是方老師上來直接講應用和底層原理,都沒有前戲的嗎???volatile 是什麼,怎麼我認為也應該從一個簡單的小例子引出來吧。

然後第三章,切換選手,上來直接全程硬菜,這一章從記憶體模型入手,講了 volatile 、final、synchronized 的記憶體語意,as-if-serial 和 happens-before 原則,Java 記憶體模型是怎樣的以及 JSR-133 對記憶體模型做了哪些改變,可以說能介紹的都介紹完了。

但是,我又要說但是了,這一章有一些內容應該是從外文網站上翻譯出來的,很多地方有些生硬,感覺像是堆砌,不像是在講課。這種講解風格我認為不如方老師講的犀利,能夠直接切入重點。這一章我剛開始看的還行,但是到了這一章後半程,明顯感覺吃力,不知道是我菜還是怎麼著,看著看和明顯犯困,不知道手機/電腦前的小夥伴們怎麼認為的。

擼完第三章,再看第四章,就感覺有點虐小號的意思,為什麼 Java 併發程式設計基礎放在第四章講??????為什麼基礎要放在底層實現的後面??????這不是本末倒置嗎?如果你是先看目錄直接從第四章看起來的倒還好,如果你從第一章慢慢慢慢看到第四章,你很可能會懷疑人生,這是什麼破玩意?真的沒有搞明白為什麼基礎要放在第四章才開始講。而且第四章這部分內容很多都是一帶而過,讓我不得不懷疑這位選手應該沒怎麼寫過文章,我身邊這些公眾號主,但凡做的好的,有一些流量的原創號主,都不可能把文章寫成這樣,大量的程式碼堆砌,講解一帶而過,這著實沒什麼用,真的建議作者把《Java併發程式設計實踐》再好好讀一讀。

看到第五章,我終於明白了沒有點 Java 併發基礎的話,最好不要看這本書,因為很容易頭大。

第六章到第十一章其實講解的有些過於基礎了,如果說這本書是想要帶讀者深入理解併發的話,書中並沒有涉及很多原始碼,但是對於那些"還沒接觸過併發程式設計,只想要了解一下 Java 併發"的同學來說,卻是一個瞭解 Java 併發一個比較好的工具書和參考書,對於那些希望面試背題的同學來說也是一樣的。

面試的時候一般會分為個階段來問:

  • 你知道 xxx 嗎?你用過 xxx 嗎?(一問看你有沒有接觸過,一般沒接觸過就不會問這個方向了)
  • 你在日常開發的過程中是如何使用 xxx 的呢?(再次判斷你有沒有接觸過,如果你能回答上來應用場景,才會繼續向下問,不然面試官就認為你在扯皮)
  • 那你知道 xxx 的原理嗎?(問你原理就是判斷你私下來有沒有研究過這個東西,可以回答 xxx 的工作機制是怎樣的,比如執行緒池的原理,你就可以回答執行緒池的工作機制)
  • 最後還可能會問你更細一些的問題,比如 HashMap 的 put 過程是怎樣的?(這個就需要熟悉原始碼了)

所以,這本書給大家帶來的知識點僅侷限於前三點,事實上,從整個行業上來說,我也沒有看到哪位作者把原始碼擼出來寫成一本書的,所以這也是我們程式設計師們努力的方向。

這裡,給讀者朋友們推薦一下我寫的關於併發方面的文章:

2w字 + 40張圖帶你參透併發程式設計!

我工作三年了,該懂併發了(乾貨)

Atomic XXX 原理解析

一文搞懂 CountDownLatch 用法和原始碼!

呵,Semaphore ,就這?

我真不想學 happens - before 了!

cxuan 連這 10 個問題都不會...

synchronized 的超多幹貨!

volatile

肝完這篇執行緒池,我咳血了

有解釋,有原始碼,有案例,是不是要來學習一波

為什麼說這本書好?

所以,為什麼說這本書好呢?

因為這本書符合我們中國人的調性,畢竟是出自中國人之手,這本書不同於《Java 併發程式設計實戰》,Java 併發程式設計實戰更多注重的是"如何編寫一手優秀的併發程式碼",而 《Java 併發程式設計的藝術》更多的是圍繞 Java 底層知識來講解的,他們的側重點不同。併發程式設計實戰畢竟是外國人寫的,它經過翻譯的過程會損失掉一些原書的魅力,所以大家儘量還是要看原版書,最好不要穿二手鞋

Java 併發程式設計的藝術還好在比較貼合現如今的面試氛圍,大家知道現在面試就是各種八股文一股腦直接衝,這種面試造火箭的面試方式我們大家都嗤之以鼻,但是又無力改變這種現狀,所以只能適應,而這本書就是一個讓你更好適應八股文面試的一本書。我上面說,這本書有幾個章節講的還是比較不錯的,這幾個章節搞懂了,基本上相關面試你十拿九穩。但是後面有一些章節比較淺顯,需要貼合網上的部落格再詳細瞭解。

為什麼說這本書不好?

為什麼說這本書不好?

我不認可這本書的敘述方式和體系結構,很容易把人給勸退。我認為這是需要反思的一點。

而且阿里的同學作為業界尤其是 Java 技術棧的頂級程式設計師,如果不能把自己的技術棧和知識體系的完備性作為最高標準要求自己,那麼我們普通程式設計師還能夠相信誰呢?

這本書讓我有一種能夠離開它但卻離不開它的一種感覺。我看《深入理解 Java 虛擬機器》的時候,就沒有這種情愫。因為看完周老師的深入理解 JVM 之後,我甚至覺得 《Java 虛擬機器規範》你就完全可以扔在一邊了。

但是,《Java 併發程式設計實戰》和 《Java 併發程式設計藝術》其實是一種互補品,缺少哪一本書的知識,我都覺得少點東西。但是隻看 Java 併發程式設計藝術這一本書又不夠,所以。。。。。。為什麼不再認真打磨一下呢?

所以,希望還能有下一版的《Java 併發程式設計藝術》,讓我們大家一起期待。

文章的最後,給大家推薦一個 github ,https://github.com/crisxuan/bestJavaer 這個 github 是我嘔心瀝血所有文章的彙總,歡迎 star 。

相關文章