5

同期アクションを含まず、単純なインスタンス変数の読み取りと書き込みのみを行う単純なシングルスレッド Java プログラムの実行を考えてみましょう。すべての書き込みを単純に無視する実装は、Java メモリ仕様に準拠しているようです。まず、§17.4からの該当する一般的なステートメント:

メモリ モデルは、プログラムの各ポイントで読み取ることができる値を決定します。分離された各スレッドのアクションは、そのスレッドのセマンティクスによって管理されるように動作する必要があります。

関連する制約は次のとおりです ( §17.4.5 )。

1. プログラムの順序によって引き起こされる事前発生順序付け:

x と y が同じスレッドのアクションであり、プログラムの順序で x が y の前にある場合、hb(x, y) になります。

2. 先行発生の一貫性:

アクションのセット A は、A 内のすべての読み取り r について、w(r) が r によって見られる書き込みアクションである場合、事前発生整合性があります。hb(r, W(r)) またはwv = rv および hb(W(r), w) および hb(w, r) となる書き込み w が A に存在します。

これは基本的に、監視する書き込みの前に読み取りが発生するのを防ぎます。もう 1 つの規定は、一部の読み取りが、その間に行われたv以前の書き込みの後に同じ.vv

書き込みが確実に観察されるという保証はまったくありません。書き込みの制限が観察されない可能性があるだけです。

ここで何が欠けていますか?JVM がそのような些細な保証を除外する可能性は本当にあるのでしょうか?

4

1 に答える 1

3

使用しましょう:

class MyClass {
    private static int i = 0;

    public static void main(String[] args) {
        i = 3; //w
        System.out.println(i); //r
    }
}
  • プログラムが正しく同期されるのは、すべての連続した一貫した実行にデータ競合がない場合のみです。
  • プログラムが正しく同期されている場合、プログラムのすべての実行は順次一貫しているように見えます (§17.4.3)。
  • プログラムに、先行発生関係によって順序付けられていない 2 つの競合するアクセス (§17.4.1) が含まれている場合、データ競合が含まれていると言われます。

    あなたのプログラムはシングルスレッドです
    => プログラムの順序制約から hb(w,r) があります
    => 正しく同期されています =>
    プログラムのすべての実行は順番に一貫しているように見えます。
    =>それは3を出力します

于 2012-08-29T10:09:48.693 に答える