Javaでマルチスレッドでグローバル変数を共有するには
Javaでは、スレッド間でグローバル変数を共有する方法は次のとおりです。
- volatile キーワードを使用する: 共有変数を volatile 型として宣言すると、スレッドごとに共有変数の読み書きが、自身のワーキングメモリーではなくメインメモリーから行われます。これにより、スレッド間の可視性が保証されます。
- synchronizedキーワードを使う。synchronizedキーワードを使って共有変数の読み書き動作を飾りつけ、同一時間にひとつのスレッドだけが共有変数にアクセスできるようにし、複数のスレッドが同時に共有変数を変更して、データ不一致問題が起こるのを防ぐ。
- ロックインターフェースを使う:ロックインターフェースとその実装クラス(ReentrantLockなど)を使用して共有変数へのアクセスを保護し、lock()メソッドによってロックを取得し、unlock()メソッドによってロックを解放する。これにより、同時に1つのスレッドだけが共有変数にアクセスできるようになる。
- Atomicクラスを使用する: AtomicIntegerやAtomicLongなどのAtomicクラスは、通常のプリミティブ型に代わるもので、getAndIncrement()、compareAndSet()などの原子操作のセットを提供し、マルチスレッド環境下での原子性と可視性を保証します。
- ThreadLocalクラスを利用する:スレッドごとに共有変数の独立したコピーを持ち、各スレッド間で干渉しないようにします。
具体的なビジネスニーズやパフォーマンス要件によって、どの方法を選択するかが決定しますが、上記の方法はすべてグローバル変数のマルチスレッド共有を実現できます。