考虑以下 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
谢谢!