【发布时间】:2011-12-05 16:00:35
【问题描述】:
我正在调试我们以前的一位开发人员编写的 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 上找到的文档表明这是由于没有从synchronized 块调用notify() 引起的;但是,这里显然不是这种情况。我确实想知道lock 的范围是否有问题,或者不同步的分配是否有问题。所有对lock 的引用都是上面的形式,队列函数中只有一个wait(long)。
最后一个可能有用的细节:发生这种情况是因为,虽然我们的设备有网络,但我们的 CMS 已关闭。我们借此机会在这种情况下测试应用程序。我怀疑队列可能正在以极快的速度运行,因为失败的下载正在重新排队,所以如果争用条件可能是导致此故障的原因,那么它可能就是这里的原因。
谢谢!
【问题讨论】:
标签: android exception locking notify