Как лучше всего освободить ресурсы (в данном случае разблокировать ReadWriteLock) при выходе из области видимости? Как охватить все возможные способы (возврат, перерыв, исключения и т. д.)?




Блок try / finally - самое близкое к такому поведению:
Lock l = new Lock();
l.lock(); // Call the lock before calling try.
try {
// Do some processing.
// All code must go in here including break, return etc.
return something;
} finally {
l.unlock();
}
И чтобы оправдать предыдущий комментарий: причина, по которой вы хотите вызвать l.lock () вне блока try, заключается в том, что lock () может вызвать исключение - и если это так, вы определенно не хотите вызывать для него unlock () (который затем вызовет исключение и затруднит поиск исходного исключения).
Как сказал Майк, вы должны выбрать блок finally. см. наконец блочный учебник, где указано:
The finally block always executes when the try block exits. This ensures that the finally block is executed even if an unexpected exception occurs.
Более удобный способ сделать это - использовать оператор try-with-resources, который позволяет имитировать Механизм RAII C++:
public class MutexTests {
static class Autolock implements AutoCloseable {
Autolock(ReentrantLock lock) {
this.mLock = lock;
mLock.lock();
}
@Override
public void close() {
mLock.unlock();
}
private final ReentrantLock mLock;
}
public static void main(String[] args) throws InterruptedException {
final ReentrantLock lock = new ReentrantLock();
try (Autolock alock = new Autolock(lock)) {
// Whatever you need to do while you own the lock
}
// Here, you have already released the lock, regardless of exceptions
}
}
"l.lock ()" действительно должен вызываться перед "try", как в примере: java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/…