16

複数のスレッドによってアクセスされるが、同期ブロック内でのみアクセスされる変数には、volatile 修飾子が必要ですか? そうでない場合、なぜですか?

4

3 に答える 3

14

volatile内部で使用する必要はありませんsynchronized。synchronized は、一貫して (すべてのアクセスで) 使用すると、変数のローカル キャッシュの正しい動作を既に保証しています。

volatileプリミティブ値で機能し、プリミティブ型へのアトミック アクセスの便利なショートカットになる可能性があります。JDK 5 では volatile の動作が 1.4 から変更されていることに注意してください。

詳細はこちら

于 2010-07-09T17:13:20.920 に答える
4

いいえ。同期ブロック内で作業する場合、キャッシュされたすべての変数はアクセス時に同期されます。これは、メモリ バリアが作成されるためです。

詳細については、このvolatile と synchronizedの比較 (説明付き) を参照してください。

于 2010-07-09T17:12:54.467 に答える
2

同じオブジェクト (またはメソッド) で同期するブロックは、同時に実行されないことが保証されています。したがって、同じオブジェクトに同期する限り、変数に同時アクセスが発生することはないため、特別な処理は必要ありません。

アクセスが同期されていない場合、競合状態が発生しています。一部のプリミティブ変数では、変数の作成volatileが正しい場合があります (volaitle に関するより良い情報については、他の投稿を参照してください)。それが役に立たない場合は、ほぼ確実にバグがあります。

于 2010-07-09T17:18:58.520 に答える