Вы не можете снять внутреннюю блокировку с другого метода, но вы можете освободить jucLock из другого метода.Например: (отредактировано на основе ответа Питера Лори, спасибо)
public boolean tryAcquireTimedLock(){
return lock.tryLock(30, TimeUnit.SECONDS);
}
public void releaseLock(){
lock.unlock();
}
Здесь предлагается удобный метод прерывистого получения блокировки с таймаутом.
Теперь давайте перейдем к ловушкам.Если вы блокируете и разблокируете другим способом, вы должны быть осторожны с любыми исключениями, которые могут возникнуть во время процесса.Невыполнение этого требования может привести к тупиковой ситуации.
public void doSomeWork(){
if(tryAcquireTimedLock()){
otherMethodWork();
finalMethodWork();
}
}
public void otherMethodWork(){
//do something that may cause an Exception
}
public void finalMethodWork(){
//finish work now release lock
releaseLock();
}
А что, если otherMethodWork()
выдает RuntimeException
?Ваш код теперь никогда не сможет вызывать releaseLock()
, и дальнейший прогресс невозможен.
Именно поэтому ему предписано использовать стиль
lock.lock();
try{
//work
}finally{
lock.unlock();
}
Если что-то не так происходит в// работа, которую вы все равно сможете разблокировать и добиться прогресса.