Java のマルチスレッドでロックを行う方法はどれですか
Javaのマルチスレッドで排他制御を行う手法には、次のようなものがあります。
- synchronizedキーワード:メソッドやコードブロックの先頭にsynchronizedキーワードを付与することでロックを実現します。synchronizedキーワードはメソッドとコードブロックを修飾でき、あるスレッドがsynchronized修飾されたメソッドやコードブロックに入ると、自動的にそのメソッドやコードブロックが属するオブジェクトのロックを取得し、他のスレッドはそのロックが解放されるまで入ることができません。
- ReentrantLockクラス:ReentrantLockクラスはJavaが提供する再入可能ロックで、ReentrantLockオブジェクトを作成することで使用します。 ロックの取得はlock()メソッド、ロックの解放はunlock()メソッドで行います。 synchronizedとは異なり、ReentrantLockクラスはロック取得の公平性や、割り込み可能なロック取得などのより多くの機能を提供しています。
- ReentrantLockクラス以外に、JavaではLockインターフェースを実装したReadWriteLock、StampedLockなどのクラスが提供されており、これらはより多くのロックメカニズムを提供し、さまざまなニーズを満たします。
- ロックインターフェースのtryLock()メソッドを使用することで、特定のメソッドやコードブロックをロックする必要があり、かつ、そのメソッドやコードブロックを長時間ロックしたくない場合に、ロックの取得を試行できます。ロックの取得に成功した場合は対応するコードを実行し、ロックの取得に失敗した場合は他のロジックを実行します。
Javaにおけるマルチスレッドにおけるロック処理の一般的なテクニックは以上であり、要件に応じて適切な手法を選択することでスレッドセーフティを実現します。