ReentrantLock を try-with-resources で安全に使う
Java 21で導入された仮想スレッドで、プラットフォームスレッドに影響を与えずに仮想スレッドに対してsynchronizedと同じ効果を得るために、ReentrantLockクラスの使用方法について投稿しました。通常のReentrantLockの使用方法は柔軟性がありますが、lock()とtryの間に処理を書くことができ、またfinallyにunlock()を書かないと不具合が発生する可能性があります。そのため、ReentrantLockを安全に使うための3つの方法を紹介しています。
- ReentrantLockをtry-with-resourcesで使用する方法
AutoCloseable対応の共通クラスを作成し、try-with-resourcesで使用します。これにより、自動的にアンロックされます。 - ReentrantLockをラムダで使用する方法
ラムダを扱える共通クラスを作成して、ラムダで使用します。これにより、アンロックがラムダ内で行われます。 - Lombokの@Lockedを使用する方法
Lombokのバージョン1.18.32で導入された@Lockedアノテーションを使用すると、ReentrantLockを簡潔に利用できます。
Spring Bootにおける仮想スレッドの対応や副作用についても記載しています。特に、Spring Bootでは3.2から仮想スレッドが利用可能であり、設定によってデーモンスレッドやアプリケーションの終了条件が変わります。また、Tomcatはバージョン11からリクエストの仮想スレッドをサポートします。