本文從兩面闡述:(1) 用 C++ 描述 Monitor Object 設計模式,幫助讀者從本質認識該模式(Java 語言層封裝屏蔽了細節);(2) 結合 C++ 版本深入理解 Java 同步機制,指導正確高效使用。
建構子獲取資源,解構子釋放資源。C++ 智慧指標、Scoped Lock 均基於此。Java 無解構子,靠 GC 管理記憶體,資源釋放用 `finally` 區塊模擬 RAII。
進入區域自動獲取鎖,離開自動釋放。C++ 用 RAII 實作 `Guard` 模板類管理 `LOCK`(如 Windows `CRITICAL_SECTION`)。Java 語言層內建支援:`synchronized` 關鍵字即為 Scoped Lock,保證進入區域獲取物件鎖,無論從何處退出(正常、異常、return)鎖皆正確釋放。
執行緒等待共享資料達特定狀態。C++ 需封裝 OS API(如 Solaris `cond_t`),關聯 Mutex。Java 根類別 `Object` 直接提供 `wait()`/`notify()`/`notifyAll()`,無需自行封裝。
並發環境下,物件方法會改變物件狀態。需解決:(1) 任一時刻唯一公共方法由唯一執行緒執行;(2) 同步透明化,調用者無需干預;(3) 方法因條件不滿足阻塞時,允許其他客戶端方法存取物件。

定義 `Message_Queue`:固定長度佇列,多生產者/消費者操作。核心欄位:`monitor_lock_` (Mutex)、`not_empty_`/`not_full_` (Condition Variables)。
關鍵點:`Guard

Java 物件本身即 Monitor Object,語言內建支援:
執行緒獲取鎖成功成為 Owner,任一時刻僅一 Owner。Owner 呼叫 `wait()` 自動釋放鎖進入等待集合。
代碼大幅簡化:`synchronized` 方法隱含鎖獲取/釋放;`wait()`/`notifyAll()` 直接可用。但無法區分 `not_empty`/`not_full` 兩條件變數,只能用 `notifyAll()` 喚醒所有等待者(C++ 版可精確 `notify()`)。
| 維度 | C++ 版 | Java 版 |
|---|---|---|
| Scoped Lock | 自行實作 `Guard` 模板 | 內建 `synchronized` 關鍵字 |
| Condition Variables | 自行封裝 OS API,可定義多條件 | 內建 `Object.wait/notify`,單一條件集合 |
| 通知精確度 | 可針對特定條件 `notify()` | 僅能 `notifyAll()` 喚醒全部 |
| 鎖粒度控制 | 靈活定義保護範圍 | `synchronized` 必須跟區塊,無法區分讀/寫鎖 |
| 代碼簡潔度 | 較冗長 | 極度簡潔 |
結論:Java 確實簡化了基於 Monitor Object 並發模式的開發。但並發實戰遠比語法簡單複雜,我們必須看清本質(鎖競爭、條件等待、喚醒風暴等)才能構建健壯並發應用。