首頁 >Java >java教程 >為什麼 Java 中的 wait() 呼叫必須始終位於同步區塊內?

為什麼 Java 中的 wait() 呼叫必須始終位於同步區塊內?

Barbara Streisand
Barbara Streisand原創
2024-12-16 22:24:11336瀏覽

Why Must `wait()` Calls Always Be Inside a Synchronized Block in Java?

為什麼 wait() 呼叫總是包含在同步區塊中?

Object.wait() 呼叫需要放置在同步區塊中以防止IllegalMonitorStateException。這是由於監視器取得和wait() 語意之間的交互作用:

監視器取得與釋放:

在Java 中,每個物件都有一個關聯的監視器。當執行緒進入同步區塊時,它會取得該物件的監視器。這可以防止其他執行緒同時存取該物件。

Wait() 語意:

Wait() 釋放與其所呼叫的物件所關聯的監視器。當一個執行緒呼叫wait()時,它會釋放監視器並等待,直到另一個執行緒對相同物件呼叫notify()或notifyAll(),此時等待執行緒重新取得監視器。

沒有同步的潛在損害:

如果可以在同步區塊之外呼叫wait(),它將允許多個執行緒存取該物件並發,可能導致不一致或死鎖。

考慮以下場景:

  • 執行緒 A 檢查是否滿足條件並在同步區塊之外呼叫 wait()。
  • 在執行緒 A 釋放監視器之前,執行緒 B 修改物件的狀態,滿足
  • 然後執行緒 B 對物件呼叫 notification()。
  • 執行緒 A 將不會收到更改通知,並且將無限期地保持阻塞狀態,從而導致死鎖。

同步的作用:

封裝 wait() 呼叫在同步區塊內保證在檢查條件和呼叫 wait() 之前取得監視器。這確保了在等待執行緒釋放監視器之前,沒有其他執行緒可以修改物件的狀態或呼叫notify()。這種同步可確保執行緒安全並防止潛在的不一致或死鎖。

以上是為什麼 Java 中的 wait() 呼叫必須始終位於同步區塊內?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn