IllegalMonitorStateException при разблокировке ReentrantLock на Android
Я использую ReentrantLock с его рекомендуемой практикой (блокировка, затем фактический код в try-block, а затем разблокировка в конце, см. Пример кода ниже). Иногда (очень очень редко) у меня возникает исключение java.lang.IllegalMonitorStateException при разблокировке. Почему так происходит? Возможно, это как-то связано с реализацией Android Java VM.
Ошибка:
java.lang.IllegalMonitorStateException
java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:126)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1232)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:430)
at com.example.dummy.backend.model.Model.unlock(Model.java:283)
at com.example.dummy.backend.engine.Engine.removeOldInstances(Engine.java:712)
at com.example.dummy.backend.engine.Engine$ProcessOnResumeWorkInBackground.doInBackground(Engine.java:836)
at com.example.dummy.backend.engine.Engine$ProcessOnResumeWorkInBackground.doInBackground(Engine.java:790)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Пример кода (слегка упрощенный):
myLock.lock();
try {
LinkedList<MyClass> myClassInstances = model.getMyClassInstances();
Iterator<MyClass> iterator = myClassInstances.iterator();
while (iterator.hasNext()) {
MyClass myClassInstance = iterator.next();
boolean toBeRemoved = true; // simple condition here
if (toBeRemoved) {
logger.info("Removing old myClassInstance " + myClassInstance.getTimestamp());
iterator.remove();
Cache.removeMyClassByCodeAndTimestamp(myClassInstance);
}
}
} finally {
myLock.unlock();
}