[天瓏連結] 圖解Java多線程設計模式

封面

大要

簡單條列心得如下。

  1. 他會假設你有Java的基礎知識,並假設你Java的執行緒相關函式還沒那麼熟,所以有一篇序章專門講這個。
  2. 序章結束後會開始介紹多執行緒下的設計模式,除了最後第十二個Active Object模式以外,其他的範例都蠻精簡短小,一目瞭然讓讀者知道設計模式的重點。
  3. 本書注重在”使用基本的API做出多執行緒設計模式”,而非”JAVA執行緒安全函式庫一覽”,所以不管轉換到任何語言,還是能夠沿用。
  4. 附錄還介紹了Java編譯的一些最佳化行為,這會告訴你為什麼理論上不會出錯的程式碼後來會出錯(不過對其他程式語言的實用性可能就略低。)

特點

我個人非常喜歡這本書,尤其是第二、三點,作者幾乎上只使用Thread(wait/sleep/notify/join)synchronized/Lock,就實作出所有模式。而且藉由不同的範例(模式),讓讀者了解在多執行緒的時候,什麼東西該鎖,什麼東西不用鎖,要注意什麼事情才不會讓程式陷入死結。

書中的模式如下:

  • Single Threaded Execution
    • 多執行緒存取同一資料的基本守則。
  • Immutable
    • 資料不給寫就不用擔心同時讀取了。
  • Guarded Suspension/Balking
    • 多執行緒下的存取同一資料的條件判斷,該立刻返回結果還是等待。
  • Producer—Consumer/Worker Thread/Thread—Per—Message
    • 一個執行緒塞資料/命令、一個(或多個)執行緒使用資料/執行命令。藉由分離這兩者來提高Response Time.
  • Read—Write Lock
    • 可以多個執行緒讀,但是有執行緒要寫就會block住。通常用在寫比讀少很多的情況。
  • Future
    • 如何從執行緒得到回傳值。
  • Two—Phase Termination
    • 將執行緒停止階段分為”停止中”跟”已停止”。
  • Thread—Specific Storage
    • 每個執行緒有自己的儲存空間,所以就不用擔心資料共用的問題了。
  • Active Object
    • 把Producer-Counsmer和Futrue模式摻再一起做爆漿撒尿牛丸。

缺點

十二種設計模式

本書說的”12種設計模式”,似乎有一點點誇大其詞,我覺得Guarded Suspension跟Balking都是多執行緒的條件判斷,只是一個是循環等待,一個是直接跳出而已。作者可能也覺得再這樣寫有點騙$,就沒有再加上一個Timeout模式,而是把Timeout當作是Balking的一種變種寫在該章節後面。

另外就是Producer—Consumer/Worker Thread/Thread—Per—Message,我也覺得根本是同一種,幾乎只差在Producer和Counsumer的關係是一對一、一對多還是一對無限。

Active Object模式看起來像是把Producer-Counsmer和Futrue模式摻再一起做爆漿撒尿牛丸,也因此那個章節的複雜度變得特別高,偏偏看起來又像是前面章節已經學過的東西,我就沒有認真看了。

沒有細緻介紹Java函式庫

雖然我不覺得這是缺點,不過由於本書是”使用基本的API做出多執行緒設計模式”,所以絕大部分範例並不使用Executors/Callable/Future等”新”(其實也蠻老的)函式庫,而是手動自己刻一個。這會不會導致有人看了之後,很興奮的想在專案上自己造輪子啊?

總結

雖然現代多半只要使用執行緒安全的函式庫,就能保證執行緒安全問題。不過還是可能會有少數情況是需要自己處理互斥條件的。這種情況下,藉由體會前人怎麼刻輪子的過程,能大大減少自己犯同樣錯誤的情況,因此我是蠻推薦這本書的。

另外這本書買來比想像中厚(當初是網路上訂),可是看起來比想像中薄。因為除了正文外,大概有三分之一的篇幅是習題解答XD。我認為多數習題也設計的蠻有意義,除了Active Object以外的章節我應該都做完了!

附帶一提,這本跟之前的圖解密碼學與比特幣原理是同一作者,不過我是看完才發現的。