AutoLock в Java – как сделать?
-
02-07-2019 - |
Вопрос
Как лучше всего освободить ресурсы (в данном случае разблокировать 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();
}
Другие советы
Как сказал Майк, вашим выбором должен быть блок «finally».увидеть наконец заблокировать учебник, где указано:
Последний блок всегда выполняется, когда блок Try выходит.Это гарантирует, что наконец -то блок выполняется, даже если происходит неожиданное исключение.
Более удобный способ сделать это — использовать оператор try-with-resources, который позволяет имитировать C++. Механизм RAII:
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
}
}
Не связан с StackOverflow