Автоблокировка в Java - как? - PullRequest
2 голосов
/ 30 сентября 2008

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

Ответы [ 3 ]

11 голосов
/ 30 сентября 2008

Блок 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();
}
2 голосов
/ 30 сентября 2008

Как сказал Майк, блок «наконец» должен быть вашим выбором. см. учебник finally , где указано:

Блок finally всегда выполняется, когда блок try выходит. Это гарантирует, что блок finally выполняется, даже если происходит непредвиденное исключение.

0 голосов
/ 27 ноября 2017

Лучший способ сделать это - использовать оператор 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

    }

}
...