Я пытаюсь выяснить, что является лучшим способом использовать try/finally с замками.Java блокировка и разблокировка различными способами. Как попробовать/наконец?
Когда я lock()
и unlock()
в том же месте, я просто использовать try/finally
блок как JavaDoc также предлагает:
lock.lock();
try{
// do something
} finally {
lock.unlock();
}
Мне интересно, что это лучшая практика, чтобы использовать try/finally
когда lock()
и unlock()
вызовы находятся в разных методах.
Для примера рассмотрим следующее:
public class X {
private ReentrantLock lock = new ReentrantLock();
public void pickUp(){
lock.lock();
// do something
}
public void putDown(){
// do something
lock.unlock();
}
}
Что бы я сделать, это поставить try/finally
блок на верхнем уровне, то есть всякий раз, когда я называю методы pickUp()
и putDown()
. Например, внутри run()
метода:
// class code
X x = new X();
public void run(){
try{
x.pickUp();
// do something
} finally {
x.putDown();
}
}
Является ли это правильный путь?
спасибо.
Опасность этого заключается в том, что ваш '// делать что-то' в' putDown() 'может генерировать исключение, которое может помешать вызову' lock.unlock() '; поэтому вам нужно будет написать 'putDown()' таким образом, что 'lock.unlock()' определенно будет вызван (например, другой блок 'try/finally'). – khelwood
Ну, но если '// делать что-то 'может вызвать исключение, я мог бы добавить предложение' catch' к тому же блоку 'try/finally', не так ли? –