為什麼 wait() 呼叫總是包含在同步區塊中?
Object.wait() 呼叫需要放置在同步區塊中以防止IllegalMonitorStateException。這是由於監視器取得和wait() 語意之間的交互作用:
監視器取得與釋放:
在Java 中,每個物件都有一個關聯的監視器。當執行緒進入同步區塊時,它會取得該物件的監視器。這可以防止其他執行緒同時存取該物件。
Wait() 語意:
Wait() 釋放與其所呼叫的物件所關聯的監視器。當一個執行緒呼叫wait()時,它會釋放監視器並等待,直到另一個執行緒對相同物件呼叫notify()或notifyAll(),此時等待執行緒重新取得監視器。
沒有同步的潛在損害:
如果可以在同步區塊之外呼叫wait(),它將允許多個執行緒存取該物件並發,可能導致不一致或死鎖。
考慮以下場景:
同步的作用:
封裝 wait() 呼叫在同步區塊內保證在檢查條件和呼叫 wait() 之前取得監視器。這確保了在等待執行緒釋放監視器之前,沒有其他執行緒可以修改物件的狀態或呼叫notify()。這種同步可確保執行緒安全並防止潛在的不一致或死鎖。
以上是為什麼 Java 中的 wait() 呼叫必須始終位於同步區塊內?的詳細內容。更多資訊請關注PHP中文網其他相關文章!