Автоблокировка в Java - как это сделать?

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 227
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Блок 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", как в примере: java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/‌…

McDowell 30.09.2008 17:11

И чтобы оправдать предыдущий комментарий: причина, по которой вы хотите вызвать l.lock () вне блока try, заключается в том, что lock () может вызвать исключение - и если это так, вы определенно не хотите вызывать для него unlock () (который затем вызовет исключение и затруднит поиск исходного исключения).

Kevin Day 01.10.2008 07:54

Как сказал Майк, вы должны выбрать блок 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

    }

}

Другие вопросы по теме