У меня есть часть (упрощенного) кода:
if(reentrantLockObject.isLocked()) {
reentrantLockObject.unlock();
}
где reentrantLockObject является java.util.concurrent.locks. ReentrantLock. Иногда я получаю IllegalMonitorStateException. Это швы, что блокировка была выпущена между проверкой и разблокировала () вызов. Как я могу предотвратить это исключение?
isLocked
возвращает, удерживает ли какой-либо поток блокировку. Я думаю, вы хотите, чтобы isHeldByCurrentThread
:
if (reentrantLockObject.isHeldByCurrentThread()) {
reentrantLockObject.unlock();
}
Сказав, что isHeldByCurrentThread
задокументирован в основном для диагностических целей - было бы необычно, если бы этот фрагмент кода был правильным подходом. Можете ли вы объяснить, почему вы думаете, что он вам нужен?
Вы должны владеть замком, чтобы иметь возможность его разблокировать. reentrantLockObject.isLocked () истинно только в том случае, если блокировкой владеет какой-то поток, не обязательно вы.
reentrantLockObject.lock();
try{
// do stuff
}finally{
reentrantLockObject.unlock();
}
Здесь поток владеет блокировкой, поэтому они могут ее разблокировать.