Domanda

Qual è il modo migliore per liberare risorse (in questo caso sbloccare ReadWriteLock) quando si lascia l'ambito? Come coprire tutti i modi possibili (ritorno, interruzione, eccezioni ecc.)?

È stato utile?

Soluzione

Un blocco try / finally è la cosa più vicina a questo comportamento:

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

Altri suggerimenti

Come ha detto Mike, un blocco finalmente dovrebbe essere la tua scelta. vedere il infine bloccare il tutorial , dove è indicato :

  

Il blocco finally sempre viene eseguito quando   il blocco try viene chiuso. Questo lo assicura   il blocco finally viene eseguito anche se   si verifica un'eccezione imprevista.

Un modo migliore per farlo è usare l'istruzione try-with-resources, che ti permette di imitare il Meccanismo 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

    }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top