以前の開発者の1人が作成したAndroidサービスをデバッグしていますが、彼Boolean
は次のように使用しています。
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
呼び出されなかったことが原因であると示唆しています。ただし、ここでは明らかにそうではありません。の範囲が問題になるのではないか、または同期されていない割り当てが問題になる可能性があるのではないかと思いました。へのすべての参照は上記の形式であり、キュー関数に1つだけあります。notify()
synchronized
lock
lock
wait(long)
最後の、おそらく有用な詳細:これは、デバイスにネットワークがありますが、CMSがダウンしているために発生しています。この状態でアプリをテストする機会を利用しています。失敗したダウンロードが再キューイングされるため、キューが途方もない速度で動作している可能性があると思われます。したがって、競合状態がこの障害の考えられる原因である場合は、ここでの原因である可能性があります。
ありがとう!