私たちの以前の開発者の一人によって書かれたAndroidのサービスをデバッグしていて、彼は次のようにBoolean
を使用しています:synchronized(lock){lock.notify();} ...でスローされたIllegalMonitorStateExceptionなぜですか?
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はダウンしています。この状態でアプリをテストする機会があります。失敗したダウンロードがキューに入れられているため、競合状態がこのフォルトの原因である場合は、原因が原因である可能性があります。
ありがとうございます!
ありがとうございました!それは私の解決策に似ています:) –
さらに、 'lock'の値が決して読み込まれないと判断したので、書き込みを取り除きました。 –