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)
- 作者: アリエル・ネットワーク株式会社,井上誠一郎,永井雅人,松山智大
- 出版社/メーカー: 技術評論社
- 発売日: 2009/09/24
- メディア: 大型本
- 購入: 26人 クリック: 360回
- この商品を含むブログ (35件) を見る