2

Javaメモリモデルの観点から「逐次一貫性」を理解しようとしています。JLSの第17章からの定義は、私にはそれほど明確ではありません。

私は私のビジョンを与え、私が間違っているなら私を訂正します。1つのスレッドの逐次一貫性を持つプログラムがあるということは、プログラムの順序でaction1がaction2の前にある場合、action2よりもaction1の結果が表示されることを意味します。

2つのスレッドがあります。

スレッド1:

action1
action2

スレッド2:

action3
action4

の結果が表示される場合action3は、の結果action2も表示されるはずaction1です。

4

2 に答える 2

6

あなたは正しいです; 逐次一貫性とは、各アクションがアトミックに実行され、すべてのスレッドにすぐに表示されることを意味します。これは、すべてのスレッドを1つのスレッドにインターリーブし、アクションを1つずつ実行するようなものです。

逐次一貫性は、Javaメモリモデルが実際に機能する方法ではないことに注意してください。

17.4.3、プログラムおよびプログラム順序からの引用:

メモリモデルとして逐次一貫性を使用する場合、これまでに説明したコンパイラとプロセッサの最適化の多くは違法になります。

于 2012-11-06T09:01:06.523 に答える
1

1スレッドの逐次一貫性とは、プログラムの順序でaction1がaction2の前にある場合、action2よりもaction1の結果を確認する必要があることを意味します。

これは正しいです。この原則がなければ、プログラミングは不可能です。

action3がaction2の結果を見る場合、action1の結果も見る必要があります。

volatile使用またはロックしない限り、そのような保証はありません。たとえば、action1は1つのキャッシュラインを更新し、action2は別のキャッシュラインを更新できます。これが発生した場合、いつ、または2番目のスレッドがそれらの変更を確認するかどうかについての保証はありません。

于 2012-11-06T09:04:37.447 に答える