私が見てきたこの答え、それがどのように述べています:
スレッド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。事前発生順序は言います:
で二つのアクションを注文することができる起こる前に、関係。ワンアクションであれば起こる-前他、最初に見えると第二の前に順序付けられています。
我々は二つの動作している場合のxとyは、我々は書くHB(x、y)のことを示すために、xが起こる-前にyと。
場合のxとyは同じスレッドの行為であり、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
。