Object.wait() 必須駐留在同步區塊中以確保執行緒安全並防止 IllegalMonitorStateException。
等待釋放關聯的監視器與該對象,允許其他線程獲取它。如果 wait() 可以在同步區塊之外調用,則可能會出現不可預測的行為。
考慮沒有同步wait() 的阻塞隊列實現:
class BlockingQueue { Queue<String> buffer = new LinkedList<>(); public void give(String data) { buffer.add(data); notify(); // Signal waiting consumer } public String take() throws InterruptedException { while (buffer.isEmpty()) { wait(); // Suspend thread without synchronization } return buffer.remove(); } }
在此範例中:
此同步問題普遍適用於等待/通知機制,無論具體實現如何。如果沒有同步,總是存在競爭條件和不可預測的執行緒行為的風險。因此,「在同步中等待」規則可以確保線程安全並防止此類問題。
以上是為什麼必須始終在同步區塊內呼叫 Object.wait()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!