javaresourcesjava-7resource-managementlocks

Are Locks AutoCloseable?


Are Locks auto-closeable? That is, instead of:

Lock someLock = new ReentrantLock();
someLock.lock();
try
{
    // ...
}
finally
{
    someLock.unlock();
}

...can I say:

try (Lock someLock = new ReentrantLock())
{
    someLock.lock();
    // ...
}

...in Java 7?


Solution

  • No, neither the Lock interface (nor the ReentrantLock class) implement the AutoCloseable interface, which is required for use with the new try-with-resource syntax.

    If you wanted to get this to work, you could write a simple wrapper:

    public class LockWrapper implements AutoCloseable
    {
        private final Lock _lock;
        public LockWrapper(Lock l) {
           this._lock = l;
        }
    
        public void lock() {
            this._lock.lock();
        }
    
        public void close() {
            this._lock.unlock();
        }
    }
    

    Now you can write code like this:

    try (LockWrapper someLock = new LockWrapper(new ReentrantLock()))
    {
        someLock.lock();
        // ...
    }
    

    I think you're better off sticking with the old syntax, though. It's safer to have your locking logic fully visible.