Pregunta

¿Cuál es la mejor manera de liberar recursos (en este caso, desbloquear el ReadWriteLock) al salir del alcance? ¿Cómo cubrir todas las formas posibles (devolución, pausa, excepciones, etc.)?

¿Fue útil?

Solución

Un bloque try / finally es lo más parecido que puede obtener a este comportamiento:

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();
}

Otros consejos

Como dijo Mike, finalmente debes elegir un bloque. vea el finalmente bloquee el tutorial , donde se indica :

  

El bloque finalmente siempre se ejecuta cuando   el bloque de prueba sale. Esto asegura que   el bloque finalmente se ejecuta incluso si   se produce una excepción inesperada.

Una mejor manera de hacerlo es usar la instrucción try-with-resources, que le permite imitar Mecanismo 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

    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top