切換語言為:簡體

Java 執行緒中 Object 類下的 wait()、notify() 與Condition 類下的 await()、signal()的區別與聯絡

  • 爱糖宝
  • 2024-07-31
  • 2074
  • 0
  • 0

在 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()

  • 喚醒所有正在等待該條件變數的執行緒。

區別

  1. 使用方式:

    • Object 類的方法只能在一個物件上使用,且通常與 synchronized 關鍵字一起使用。

    • Condition 類的方法則需要配合 Lock 使用。

  2. 靈活性:

    • Condition 提供了更多的靈活性,比如可以在不同的條件下喚醒特定的執行緒集合。

    • Object 類的方法相對簡單,但不夠靈活。

  3. 可中斷性:

    • await() 支援中斷,即在等待過程中可以透過中斷執行緒來退出等待狀態。

    • wait() 也可以透過中斷來實現,但是需要在呼叫 wait() 之前檢查中斷標誌。

  4. 異常處理:

    • await() 和 signal*() 方法丟擲 InterruptedException。

    • wait() 和 notify*() 方法不丟擲異常,而是透過 InterruptedException 設定執行緒的中斷狀態。

  5. 多條件支援:

    • Condition 允許為同一個鎖建立多個條件變數,從而實現更復雜的同步邏輯。

    • Object 類的方法只允許對單個物件進行同步操作。

聯絡

兩者都是爲了實現執行緒間的同步和協作。它們都提供了等待和喚醒執行緒的能力,只是實現的方式和使用的場景不同。在實際應用中,根據具體的同步需求選擇合適的方法。如果只需要簡單的同步邏輯,可以使用 Object 類的方法;如果需要更復雜、更靈活的同步控制,則可以選擇 Condition 介面的方法。


源自:ai

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.