Поскольку блок try / finally является единственным способом гарантировать выполнение сегмента кода после завершения другого.
Вы спрашиваете, почему бы не сделать это:
public void function1(){
read.lock();
this.getSharedInt();
read.unlock();
}
Что происходит, когда this.getSharedInt()
выдает исключение? Тогда ваша строка read.unlock()
не будет выполнена, что приведет к тупику программы. Конечно, это может быть на 100% сертифицировано, чтобы не выдавать исключение прямо сейчас , но что произойдет, когда вы выполните рефакторинг для хранения этого общего int в файле или базе данных?
Наконец, не забывайте, что try / finally также учитывает ошибки, которые могут генерироваться средой выполнения практически на любой строке программы, даже если функция гарантированно не выдает никаких исключений.
Обратите внимание, что этот код также будет работать, но он исключает исключение. Использование finally
вместо этого позволяет исключению распространяться нормально, но все еще разблокируется при любых условиях.
public void function2(){
read.lock();
try {
this.getSharedInt();
} catch(Throwable t) {}
read.unlock();
}