Java中的自动锁定-如何?

Java中的自动锁定-如何?,java,synchronization,locking,Java,Synchronization,Locking,离开作用域时释放资源(在本例中解锁ReadWriteLock)的最佳方式是什么?如何涵盖所有可能的方式(返回、中断、异常等)?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.

离开作用域时释放资源(在本例中解锁ReadWriteLock)的最佳方式是什么?如何涵盖所有可能的方式(返回、中断、异常等)?

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

就像迈克说的,最后一个街区应该是你的选择。请参阅,其中说明:

最后一个块总是在 try块退出。这确保 即使 发生意外异常


一个更好的方法是使用try with resources语句,它可以让您模仿C++:


“l.lock()”确实应该在“try”之前调用,如示例所示:为了证明前面的注释是正确的:您希望在try块之外调用l.lock()的原因是lock()可能会引发异常,如果它引发异常,您肯定不想对其调用unlock()(这将抛出一个异常,并且很难找到原始的异常抛出)。
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

    }

}