Я отлаживаю сервис 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
, предполагает, что она вызвана не вызовом notify()
из блока synchronized
; однако, это явно не тот случай. Я действительно задавался вопросом, может ли быть проблема области действия lock
, или могут быть несинхронизированные назначения. Все ссылки на lock
имеют форму выше, только одна wait(long)
в функции очереди.
Еще одна заключительная, возможно, полезная деталь: это происходит потому, что, хотя у нашего устройства есть сеть, наша CMS не работает. Мы пользуемся возможностью протестировать приложение в таком состоянии. Я подозреваю, что очередь может работать с головокружительной скоростью, потому что неудачные загрузки ставятся в очередь, поэтому, если условие гонки является возможной причиной этой ошибки, то это может быть причиной здесь.
Спасибо!