おそらく同様の質問:Javaの変数がデフォルトで揮発性でないのはなぜですか?
Do you ever use the volatile keyword in Java?
今日、私は私のゲームをデバッグました。数分ごとに表示される非常に困難なスレッド問題がありましたが、再現するのは難しかったです。最初に私の方法のそれぞれにキーワードを追加しました。それはうまくいかなかった。その後、すべてのフィールドに
volatile
というキーワードを追加しました。問題はちょうどそれ自身を修正するようだった。
いくつかの実験の後、担当するフィールドがゲームの現在の状態(再生中またはビジー状態のいずれか)を記録したGameState
オブジェクトであることがわかりました。ビジー状態のとき、ゲームはユーザーの入力を無視します。私が持っていたのは、常にstate
という変数を変更したスレッドでしたが、イベントスレッドはstate
という変数を読み取りました。しかし、あるスレッドが変数を変更した後、他のスレッドが変更を認識するまで数秒かかるため、最終的に問題が発生します。
状態変数volatile
を作成することで修正されました。
Javaの変数がデフォルトでvolatile
でないのはなぜですか?また、volatile
キーワードを使用しない理由は何ですか?
同じ理由で、メソッドはデフォルトで同期されません。 –
@mP:そうは思わない。揮発性と同期化は同等ではない:ボラティリティはデッドロックを引き起こすことができない。 –