[解決済み】JavaにおけるVolatileとStaticの比較
質問
というのは正しいのでしょうか?
static
はすべてのオブジェクトに対して1つの値のコピーを意味し
volatile
は、すべてのスレッドに対して1つの値のコピーを意味するのですか?
とにかく
static
変数の値もすべてのスレッドで1つの値になるのであれば、なぜ
volatile
?
解決方法は?
を宣言することで
静的
Javaでは、クラスのオブジェクトがいくつ作成されても、コピーは1つだけです。この変数は
Objects
が全く作成されない。しかし、スレッドはその値をローカルにキャッシュしているかもしれません。
ある変数が
揮発性
であって
静的
の場合、各変数に1つの変数が存在します。
Object
. つまり、表面上は普通の変数と変わらないように見えますが、実際には
静的
. しかし
Object
フィールドを使用する場合、スレッドはローカルに変数の値をキャッシュすることができます。
つまり、2つのスレッドが同じオブジェクトの変数を同時に更新し、その変数がvolatileと宣言されていない場合、一方のスレッドが古い値をキャッシュしているケースがあり得るということです。
をアクセスしても 静的 の値を複数のスレッドで使用する場合、各スレッドはローカルにキャッシュされたコピーを持つことができます! これを避けるために、変数を 静的voltaile で、これはスレッドに毎回グローバルな値を読み込ませることになります。
しかし
揮発性
は、適切な同期の代用にはなりません!
例えば、こんな感じです。
private static volatile int counter = 0;
private void concurrentMethodWrong() {
counter = counter + 5;
//do something
counter = counter - 5;
}
実行中
concurrentMethodWrong
を同時に何度も実行すると、カウンタの最終的な値が 0 以外になる可能性があります!
この問題を解決するためには、ロックを実装する必要があります。
private static final Object counterLock = new Object();
private static volatile int counter = 0;
private void concurrentMethodRight() {
synchronized (counterLock) {
counter = counter + 5;
}
//do something
synchronized (counterLock) {
counter = counter - 5;
}
}
または
AtomicInteger
クラスがあります。
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] 揮発性 vs. 連動性 vs. ロック性
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] android.support.v4.app.FragmentActivity' で 'TAG' がプライベートアクセスされている。
-
[解決済み] Java の文字列インデックスが範囲外です。0 [閉店]
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] init-paramとcontext-param
-
[解決済み】Volatile booleanとAtomicBooleanの比較
-
[解決済み】Javaにおけるvolatileとsynchronizedの違いについて
-
[解決済み] Volatile Vs Atomic [重複](揮発性対原子)。