2013-10-05 57 views
0

考慮下面的執行語句:的Java:永遠等待THEAD

(1)線程A:檢查特定鎖定狀態和失敗 (2)線程A:因此,試圖去等待狀態 (3)線程B:信號notifyAll()

考慮如果Java的VM按照以下順序重新排序代碼(1),(() 3),(4),(2)。我相信這樣的情況是可能的,在這種情況下,可能會有問題,因爲線程A會永遠等待狀態,因爲沒有其他線程可以通知!

編輯1:我沒有使用同步塊進行鎖定。相反,我使用AtomicInteger來獲得一段代碼的鎖定。考慮一個RWLock類,它有一個原子變量N.隨着進入鎖定狀態的讀者和寫者數量增加或減少。這個問題適用於這種情況,而不是同步塊/方法。

+0

這就是爲什麼你需要持有對象的鎖調用等待或通知就可以了。這使得你的序列不可能。如果我沒有正確理解,然後發佈說明您的問題的代碼。 –

+0

我做了一些更改。如果您需要更多信息,請詢問。 –

回答

1

如果您使用wait()/ notifyAll()模式,那麼您應該在兩個調用的鎖定對象上進行同步。這可以防止您建議的重新排序。

例如

private final Object lock = new Object(); 

public void waiting() 
{ 
    sychronized (lock) 
    { 
    while (waitCondition) 
     lock.wait(); 
    } 
} 

public void notifying() 
{ 
    sychronized (lock) 
    { 
    // change wait condition, probably 

    lock.notifyAll(); 
    } 
} 
+0

我沒有使用同步塊。我正在使用Atomic Integer來應用鎖。對不起,我應該在我的帖子中指定。 –

相關問題