Frage

Was ist der beste Weg, um freie Ressourcen (in diesem Fall entriegeln die ReadWriteLock), wenn der Umfang zu verlassen? Wie alle Möglichkeiten abzudecken (Rückkehr, Pause, Ausnahmen usw.)?

War es hilfreich?

Lösung

Ein try / finally-Block ist die nächste Sache, die Sie dieses Verhalten zu bekommen:

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

Andere Tipps

Wie mike sagte ein finally-Block Ihre Wahl sein sollte. finden Sie in der schließlich Tutorial blockieren, wo es heißt, :

  

Der finally-Block immer wird ausgeführt, wenn   die try-Block beendet. Dadurch wird sichergestellt, dass   der schließlich Block ausgeführt, selbst wenn   eine unerwartete Ausnahme auftritt.

Ein schöner Weg, es zu tun ist, die Try-mit-Ressourcen-Anweisung zu verwenden, die können Sie C ++ 's RAH Mechanismus :

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

    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top