Javaメモリモデルで私を悩ませているものがあります(すべてを正しく理解していても)。2 つのスレッド A と B がある場合、A と B の両方が同じモニターで同期しない限り、B が A によって書き込まれた値を参照できるという保証はありません。
スレッド間のキャッシュの一貫性を保証するシステム アーキテクチャでは、問題はありません。ただし、アーキテクチャがハードウェアのキャッシュ コヒーレンシをサポートしていない場合、これは基本的に、スレッドがモニターに入るたびに、以前に行われたすべてのメモリ変更をメイン メモリにコミットし、キャッシュを無効にする必要があることを意味します。そして、それは全体である必要がありますこれは、モニターが保護するメモリ内の変数に関する情報を持っていないためです。しかし、それは、頻繁に同期する必要があるアプリケーションのパフォーマンスに確実に影響を与えます (特に、実行時間の短いジョブを含むジョブ キューなど)。では、Java は、ハードウェア キャッシュ コヒーレンシのないアーキテクチャでも十分に機能するのでしょうか? そうでない場合、メモリ モデルが可視性についてより強力な保証をしないのはなぜですか? 言語がモニターによって保護されている情報を必要とする場合、より効率的ではないでしょうか?
ハードウェアでキャッシュの一貫性が保証されている場合でも、メモリ モデルは両方の世界で最悪の事態をもたらします。同期が絶対に必要であり、一方で、一貫性のないアーキテクチャ (フル キャッシュ フラッシュ) ではパフォーマンスが低下します。では、より厳密にする (モニターによって保護されている情報を要求する) べきではないか、潜在的なプラットフォームをキャッシュ コヒーレント アーキテクチャに制限するべきではないでしょうか?
今のままでは、あまり意味がありません。この特定のメモリ モデルが選択された理由を説明できる人はいますか?
編集:振り返ってみると、strictとloseの使用は悪い選択でした。保証が少ない場合に「厳密」を使用し、反対の場合に「失う」を使用しました。混乱を避けるために、より強いまたはより弱い保証の観点から話す方がおそらく良いでしょう.