2017-10-01 13 views
0

私はthis questionに受け入れられた答えにコードを実行しようとしたが、私のマシンで無期限に実行されます。この現象を引き起こすボンネットの下で何が起こっていますか?つまり、一方のスレッドは、他方のスレッドがそうでないと見なしていますか?人々はメインメモリにフラッシュされないが、このキャッシュはどこにあるのですか?それはJVMに置かれていますか、それはCPUメモリキャッシュですか、それともCPUレジスタですか?Javaのスレッド可視性問題の根本原因は何ですか?

答えて

0

あなたが指摘した問題で説明したように、volatileキーワードを持たない変数は、コンパイラのJITプロセッサによって何らかの形で最適化され、共有メモリからの読み出しがないようにすることができます。したがって、変数はスレッド用のCPUレジスタに格納され、異なる値を持つ2つの別個の変数(スレッドごとに1つ)を持つことで終了します。

これはなぜvolatileキーワードが有用であるかを説明します。この非常に同じコードは、このキーワードがないと期待どおりに動作しない場合があります。

ここでははキャッシュ質問ですが、私は思っていますが、良い答えはありません。それはどの層にあってもよい。

:コメントは@polygnomeによって投稿されたリンクは素晴らしいです。あなたは間違いなくそれを読むべきです。

+0

お返事ありがとうございます。私は@polygnomeが彼のコメントを削除したと思います、あなたが言及したリンクを追加してもよろしいですか? – Shane

+0

あなたは質問がすでにリンクで返答されているとフラグが付けられました。そのリンクを確認してください。 – Xvolks

関連する問題