2013-11-25 33 views
1

我從同步塊調用notify()方法,我得到一個java.lang.IllegalMonitorStateException。我在這個特定的對象上同步,所以我沒有看到我錯在哪裏。我的代碼是這樣的:通知()調用IllegalMonitorStateException

public void setSynchronizer() { 
    synchronized (_synchronizer) { 
     _synchronizer = true; 
     _synchronizer.notify(); 
    }  
} 

有人可以幫我嗎?

回答

3

我認爲_synchronizer是一個Boolean對象。當你做

_synchronizer = true; 

編譯器解決trueBoolean.TRUE引用的對象。

如果_synchronizerBoolean.FALSE或另一個Boolean對象之前,那麼您指的是不同的對象。您沒有該對象上的顯示器,因此notify()失敗。

如註釋中所述,您不應該在可能更改的引用(對象)上同步。您可以更改由變量引用的對象的狀態,但不能更改變量本身的引用。開始的好地方是隻有​​的final變量。

+0

這裏應該添加註釋,即在可變變量上同步不是一個好主意的地方。 – Holger

+1

+1「只對'final變量」使用'synchronized'是一個很好的口頭禪。我還沒有找到一個很好的理由偏離這個規則。 –

+0

謝謝!你的評論幫了我很多。問題在於賦值「_synchronizer = true;」爲_synchronizer分配了一個新對象,所以同步無效。我已將_syncronizer更改爲Boolean []。新狀態被分配給_syncronizer [0],所以對象保持不變。 – user3032925