多線程程式設計雖複雜,但若能站在較高層次思考,許多原理其實早已掌握。本文將從兩個線程的互動切入,歸納出五大核心模式,並探討模式學習的本質,最後以《孫子兵法》為例,說明設計模式的普世性。
假設系統中只有兩個線程,它們可能發生以下情況:
當一個線程進入監視器(持有某物件鎖)時,另一個線程只能等待或放棄(返回)。「放棄」即為 Balking 模式。
兩線程需依特定順序執行,而非交由作業系統調度。此時需一個物件協調調度,此即 Scheduler 模式(作業系統核心概念)。
同時讀取共享資源可並行,但同時寫入會導致資料競爭。需引入讀寫鎖機制區分讀寫權限。
一線程生產資料(如網路傳輸),另一線程消費(如介面顯示)。資料未就緒時消費者需等待,雙方透過共享緩衝區協作。
線程終止不完全由 OS 控制,而是依特定條件有序結束,確保資源正確釋放。
設計模式源自西方,但我們祖先的《孫子兵法》實則是優秀的設計模式集:在特定條件下,以特定方式高效解決問題。只差在應用領域(軍事)與完備性研究。若能善用類比,或許今日設計模式將由中國人主導教學。
類比是發明與發現的常用方法。外國技術並不神秘,關鍵在於從自身文化挖掘智慧。
深入研究可參考 Doug Lea 著《Concurrent Programming in Java》。