在 Java 中,wait(), notify(), 和 notifyAll() 方法是 java.lang.Object 類中的原生方法,用於執行緒間的同步和通訊。而 await(), signal(), 和 signalAll() 方法則是 java.util.concurrent.locks.Condition 介面中的方法,提供了一種更高階的執行緒間同步機制。
Object 類的方法
wait()
使當前執行緒進入等待狀態,並釋放物件鎖。
當其他執行緒呼叫該物件的 notify() 或 notifyAll() 方法時,等待執行緒可以被喚醒。
呼叫 wait() 必須持有物件鎖。
notify()
喚醒正在等待該物件鎖的一個執行緒(如果有的話)。
只能喚醒一個執行緒,具體喚醒哪個執行緒由JVM決定。
notifyAll()
喚醒所有正在等待該物件鎖的執行緒。
Condition 類的方法
await()
使當前執行緒進入等待狀態,並釋放鎖。
當其他執行緒呼叫 signal() 或 signalAll() 方法時,等待執行緒可以被喚醒。
呼叫 await() 必須持有對應的鎖。
signal()
喚醒一個正在等待該條件變數的執行緒(如果有的話)。
只能喚醒一個執行緒,具體喚醒哪個執行緒由JVM決定。
signalAll()
喚醒所有正在等待該條件變數的執行緒。
區別
使用方式:
Object 類的方法只能在一個物件上使用,且通常與 synchronized 關鍵字一起使用。
Condition 類的方法則需要配合 Lock 使用。
靈活性:
Condition 提供了更多的靈活性,比如可以在不同的條件下喚醒特定的執行緒集合。
Object 類的方法相對簡單,但不夠靈活。
可中斷性:
await() 支援中斷,即在等待過程中可以透過中斷執行緒來退出等待狀態。
wait() 也可以透過中斷來實現,但是需要在呼叫 wait() 之前檢查中斷標誌。
異常處理:
await() 和 signal*() 方法丟擲 InterruptedException。
wait() 和 notify*() 方法不丟擲異常,而是透過 InterruptedException 設定執行緒的中斷狀態。
多條件支援:
Condition 允許為同一個鎖建立多個條件變數,從而實現更復雜的同步邏輯。
Object 類的方法只允許對單個物件進行同步操作。
聯絡
兩者都是爲了實現執行緒間的同步和協作。它們都提供了等待和喚醒執行緒的能力,只是實現的方式和使用的場景不同。在實際應用中,根據具體的同步需求選擇合適的方法。如果只需要簡單的同步邏輯,可以使用 Object 類的方法;如果需要更復雜、更靈活的同步控制,則可以選擇 Condition 介面的方法。
源自:ai