我調試通過我們之前的開發者之一寫一個Android服務,而他使用的Boolean
以下列方式:IllegalMonitorStateException拋出synchronized(lock){lock.notify();} ...爲什麼?
public static class DownloadQueue extends LinkedHashMap
{
// ...
private Boolean lock = new Boolean(false);
// ...
//typical notify use
synchronized public Object addToHead(Object key, Object value)
{
// ...
synchronized (lock)
{
//IllegalMonitorStateException FROM HERE
lock.notify();
}
// ...
return null;
}
//queue machinery
public DownloadRecord getFirst()
{
// we block because queue is empty
if(this.size() == 0 || (MyApp.isInternetConnectionAvailable() == false))
{
try
{
lock = true;
synchronized (lock)
{
lock.wait(30000);
}
lock = false;
}
catch (InterruptedException e)
{}
//continue operating the queue
// ...
return value;
}
}
我上IllegalMonitorStateException
發現文檔建議它是由不調用notify()
引起一個塊;然而,這顯然不是這種情況。我確實懷疑lock
的範圍可能是一個問題,還是不同步的分配是可能的。所有對lock
的引用都是上面的形式,只有一個wait(long)
在隊列函數中。
最後一個可能有用的細節:這是因爲,雖然我們的設備有網絡,但我們的CMS已關閉。我們正在藉此機會在這種情況下測試該應用。我懷疑隊列可能以極快的速度運行,因爲失敗的下載會得到重新處理,所以如果競爭條件是導致此故障的一個可能原因,那麼這可能是原因。
謝謝!
謝謝!這看起來像我的解決方案:) –
我另外確定'鎖'的值永遠不會被讀取,所以我刪除了寫入。 –