try-with-resources で lock を使う

Java7 から導入された try-with-resources は Closeable, AutoCloseable を実装したクラスならスコープを抜ける時に自動的に close を呼び出してくれるというものである。例外時にも close してくれるのでリソースリークの心配が無い。

さてこの try-with-resources はリソースに限らず、Closeable, AutoCloseable を実装してさえいれば良いので、ロックの獲得、解放にも使うことができる。


今まではある Lock オブジェクト lock が存在した時、下記のように書くのが定番だった。

lock.lock();
try {
    ...
} finally {
    lock.unlock();
}

これを止め、ちょっとしたユーティリティを書けば下記のように記述することができる、

try (ScopedLock guard = new ScopedLock(lock)) {
    ...
}

少し綺麗になる。finally 句のブロックが無くなり、try-with-resources を使うことで「どこで return しても大丈夫」という安心感が得られる。


このように書くのは下記のようなユーティリティを用意すれば良い。

public class ScopedLock implements AutoCloseable {
    private final Lock lock;

    public ScopedLock(Lock lock) {
        lock.lock();
        this.lock = lock;
    }

    @Override
    public void close() {
        lock.unlock();
    }
}

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)