スレッドBは、変更が可能スレッド見たい場合は、すべてのとは対照的に、唯一の最後の変更は揮発性変数にすることができますか?

マリオIshac:

私が見てきたこの答え、それがどのように述べています:

スレッドAは、揮発性変数Vへの書き込み、およびスレッドBがVから読み取る新しいメモリモデル、下、VはBに見えるようになりました保証されて書かれた時点でAに表示した任意の変数値

したがって、例を与え。

public class Main {
    static int value = -1;
    static volatile boolean read;

    public static void main(String[] args) {
        Thread a = new Thread(() -> {
            value = 1;
            read = true;
        });

        Thread b = new Thread(() -> {
            while (!read);

            System.out.println("Value: " + value);
        });

        a.start();
        b.start();
    }
}

変更されるvalue(-1から1までは)の不揮発性にもかかわらず、Bを通すために目に見えることが保証value(のみread)?

もしそうであれば、別のスレッドから見えることを意図して行われる変更の束を与え、揮発性最後のもの以外の変更された変数を作るの任意の目的はありますか?

アンドレアス:

はい、への変更は、valueスレッドBに見えることが保証されます。

JLS 17.4.4。同期順序は言います:

  • 揮発性変数への書き込みV(§8.3.1.4)を同期さ-と後続のすべてがの読み出しV(「後続」が同期順序に従って定義される)任意のスレッドによって。

JLS 17.4.5。事前発生順序は言います:

で二つのアクションを注文することができる起こる前に、関係。ワンアクションであれば起こる-前他、最初に見えると第二の前に順序付けられています。

我々は二つの動作している場合のxyは、我々は書くHB(x、y)のことを示すために、xが起こる-前にyと

  • 場合のxyは同じスレッドの行為であり、xが前に来るのy、その後、プログラムの順序でHB(x、y)を

  • ある起こる、前縁オブジェクトのコンストラクタの端からそのオブジェクトのファイナライザ(§12.6)の開始。

  • アクション場合、X同期化し-と、次のアクションyが、その後、我々はまた、持っている(x、y)をHB

  • もしHB(X、Y)HB(Y、Z) 次いでHB(X、Z)

銃弾1は、それが言うvalue = 1 事前発生します read = true
弾丸3は、それが言うread = true 事前発生します !read
銃弾1は、それが言う!read 事前発生します "Value: " + value
弾丸4は、それが言うvalue = 1 事前発生します "Value: " + value

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=187687&siteId=1