2012-04-02 4 views
15

私は、1つの変数について起こった関係を理解し​​ていると思います。揮発性フィールドを書き込むと、このフィールドの後続のすべての読み取りにこの新しい値が格納されます。 volatileを書き込むと、メモリバリアを越えてメインメモリに新しい値がフラッシュされます。Javaメモリモデル - メモリの境界を超えてメモリにフラッシュされるのは何ですか?

他のすべてのケースで何が起こるかはまだわかりません。例えば、Thread.start()、​​、または新しいロックjava.util.concurrentです。彼らはまた、記憶の壁を越えているということは何を意味していますか?ローカルキャッシュからメインメモリにフラッシュされるデータは何ですか?言い換えれば、はどのような交差点の範囲です

は常にフラッシュすべてのですか?今すぐ戻ってvolatileに、それは1つだけvolatileフィールドよりも多くをフラッシュしていますか?

答えて

12

メモリバリアを超えた場合、JVMが(現在のスレッドのコンテキスト内で)すべてのローカルに同期してメインメモリと変数を、キャッシュされました。それ以外に、メインメモリにダーティとマークされたローカルにキャッシュされたデータもすべて削除されます。揮発性について

- はい、それはまた、ローカルメインメモリにキャッシュされたすべてのもの、(1.5以降)、単一の揮発性のフィールドだけでなく

http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml

+0

良い点を同期します。私は言語を変えた。 –

+0

また、あなたはそれが中央メモリに汚れているすべてのキャッシュされたストレージを削除することを言及する必要があります。ごめんなさい。これは良い質問です。 – Gray

+0

@Grayあなたは、メインメモリに手の込んだ(またはリンクを提供)汚れたキャッシュされたストレージにしてくださいだろうか?それは何ですか? –

関連する問題