本系列前兩部分介紹了 CSP (Communicating Sequential Processes) 理論基礎與 JCSP 核心構造 (Process、Channel、Parallel、Guard/Alternative)。本文深入探討:
java.util.concurrent 的定位差異與互補關係將横切關注點 (安全、日誌、事務) 封裝為 Aspect,透過切點與織入機制注入業務邏輯,實現關注點分離。
將業務邏輯與横切功能建模為獨立 Process,透過 Channel 組合 (Compose) 形成 Process Network。例如:
| 維度 | AOP | CSP (JCSP) |
|---|---|---|
| 模組化單元 | Aspect (靜態/動態織入) | Process (運行時組合) |
| 組合機制 | 切點匹配 + 織入器 | Channel 連接 + Parallel 組合 |
| 關注點分離 | 編譯期/載入期/運行期織入 | 進程邊界天然隔離,通道顯式通訊 |
| 可見性 | 織入後程式碼隱性修改 | 網絡拓撲圖可視、可驗證 |
| 副作用控制 | 依賴切面設計規範 | 進程內部狀態封裝,無共享記憶體 |
CSP 的組合性 (Compositionality) 使其天然具備 AOP 的模組化優勢,且無需魔法般的織入機制,所有連接關係在程式碼中顯式可見。
// 建立 3 方 Barrier
Barrier barrier = new Barrier(3);
// 每個 Process 完成階段性工作後
barrier.sync(); // 阻塞直到 3 方皆到達
sync() 遞減並 wait(),歸零時 notifyAll() 並重置計數器。Parallel 內部即使用 Barrier 實現多進程同步啟動/結束。enroll()/resign() (註冊/退出),但需嚴格控制 Barrier 物件可見性防止惡意干擾。Bucket bucket = new Bucket();
// 工作進程
bucket.fallInto(); // 阻塞等待
// 調度器進程
bucket.flush(); // 喚醒所有阻塞進程,返回被釋放進程數量
ProcessManager pm = new ProcessManager();
pm.addProcess(myProcess);
// 同步運行 (阻塞直到進程結束)
pm.run();
// 異步啟動 (立即返回,進程在獨立執行緒運行)
pm.start();
// 陣列索引越前優先級越高
CSProcess[] processes = { highPriorityProcess, lowPriorityProcess };
new PriParallel(processes).run();
Thread.setPriority),實際效果視 JVM/OS 調度器而定。| 構造 | 用途 |
|---|---|
| BlackHoleChannel | 實作 ChannelOutput,write() 為空實作。用於「不需要輸出」時避免死鎖,充當資料黑洞。 |
| Paraplex | 多輸入通道 → 單一輸出通道 (打包成陣列)。適合表格化資料聚合 (如三欄:自然數、平方、費波那契)。 |
| Deparaplex | 單一輸入通道 (陣列) → 多輸出通道 (拆解元素)。Paraplex 逆操作。 |
Doug Lea util.concurrent 移植入標準庫 (JDK 5+),提供高效能、標準化的底層並發工具箱:原子變數、鎖、執行器、佇列、同步器 (CountDownLatch, CyclicBarrier, Phaser)、Fork/Join 框架。
| 維度 | java.util.concurrent | JCSP |
|---|---|---|
| 抽象層級 | 低階 (鎖、原子、執行緒池) | 高階 (Process、Channel、Network) |
| 程式模型 | 共享記憶體 + 鎖協調 | 通訊順序進程 (無共享狀態) |
| 驗證能力 | 困難 (需人工推理) | 形式化模型檢查 (FDR2) |
| 組合性 | 手動組合 | 語言級組合 (Parallel 遞歸) |
| 分布式擴展 | 需額外框架 (RMI, gRPC, Akka) | JCSP.Net 原生支援 |
synchronized/wait/notify),降低實作開銷。下次面對複雜多執行緒設計時,請嘗試 JCSP:以通道連接進程,而非鎖保護共享物件。您將獲得可驗證、可維護、可分布式部署的並發架構。
Abhijit Belapurkar,IIT Delhi 計算機科學學士,11 年分布式架構與資安經驗,6 年 Java N-tier 開發,現任 Infosys 班加羅爾高級技術架構師 (J2EE 領域)。