考虑以下 Java 代码:
volatile boolean v1 = false;
volatile boolean v2 = false;
//Thread A
v1 = true;
if (v2)
System.out.println("v2 was true");
//Thread B
v2 = true;
if (v1)
System.out.println("v1 was true");
如果有一个全局可见的 volatile 访问总顺序,那么总是会达到至少一个 println。
Java 标准真的保证了这一点吗?或者这样的执行是否可行:
A: v1 = true;
B: v2 = true;
A: read v2 = false;
B: read v1 = false;
A: v2 = true becomes visible (after the if)
B: v1 = true becomes visible (after the if)
我只能在标准中找到关于访问相同 volatile 变量的语句(但我可能遗漏了一些东西)。
“写入 volatile 变量 (§8.3.1.4) v 与任何线程对 v 的所有后续读取同步(其中后续是根据同步顺序定义的)。”
http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4.4
谢谢!
最佳答案
v1/v2的volatile read/write这4个 Action 都是同步 Action 。执行对它们有一个同步顺序,这是一个总顺序。该顺序必须保持每个线程的程序顺序。
这使得推理变得非常容易。显然,至少对于 2 个变量中的 1 个,在“同步顺序”中,写入它的顺序先于读取它。因此,写入与读取“同步”。因此,写入“先于”读取。因此,写入对读取可见。
关于java - !different! 之间的总订单 volatile 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555463/