Разблокируйте на ReentrantLock без IllegalMonitorStateException

У меня есть часть (упрощенного) кода:

if(reentrantLockObject.isLocked()) {
       reentrantLockObject.unlock();
}

где reentrantLockObject является java.util.concurrent.locks. ReentrantLock. Иногда я получаю IllegalMonitorStateException. Это швы, что блокировка была выпущена между проверкой и разблокировала () вызов. Как я могу предотвратить это исключение?

11
задан Mikhail 11 May 2010 в 13:51
поделиться

2 ответа

isLocked возвращает, удерживает ли какой-либо поток блокировку. Я думаю, вы хотите, чтобы isHeldByCurrentThread :

if (reentrantLockObject.isHeldByCurrentThread()) {
    reentrantLockObject.unlock();
}

Сказав, что isHeldByCurrentThread задокументирован в основном для диагностических целей - было бы необычно, если бы этот фрагмент кода был правильным подходом. Можете ли вы объяснить, почему вы думаете, что он вам нужен?

20
ответ дан 3 December 2019 в 02:52
поделиться

Вы должны владеть замком, чтобы иметь возможность его разблокировать. reentrantLockObject.isLocked () истинно только в том случае, если блокировкой владеет какой-то поток, не обязательно вы.

  reentrantLockObject.lock();
  try{

       // do stuff
  }finally{
         reentrantLockObject.unlock();
  }

Здесь поток владеет блокировкой, поэтому они могут ее разблокировать.

6
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: