考慮下面的執行語句:的Java:永遠等待THEAD
(1)線程A:檢查特定鎖定狀態和失敗 (2)線程A:因此,試圖去等待狀態 (3)線程B:信號notifyAll()
考慮如果Java的VM按照以下順序重新排序代碼(1),(() 3),(4),(2)。我相信這樣的情況是可能的,在這種情況下,可能會有問題,因爲線程A會永遠等待狀態,因爲沒有其他線程可以通知!
編輯1:我沒有使用同步塊進行鎖定。相反,我使用AtomicInteger來獲得一段代碼的鎖定。考慮一個RWLock類,它有一個原子變量N.隨着進入鎖定狀態的讀者和寫者數量增加或減少。這個問題適用於這種情況,而不是同步塊/方法。
這就是爲什麼你需要持有對象的鎖調用等待或通知就可以了。這使得你的序列不可能。如果我沒有正確理解,然後發佈說明您的問題的代碼。 –
我做了一些更改。如果您需要更多信息,請詢問。 –