考虑以下用 Java 编写的多线程代码:
共享变量:
boolean n; // non-volatile
volatile boolean v; // volatile
线程 1:
v = true;
System.out.println("n=" + n);
线程 2:
n = true;
System.out.println("v=" + v);
假设最初n = v = false
。
现在:
- 的输出是否
v=false
暗示 的输出n=true
? n
如果是 volatile会发生什么变化?n
如果是的话会发生什么变化java.util.List
(这样n = true
就变成n.add("something")
了并且输出n=true
变成了["something"]
)?- UPD3:如果所有对它
v
的AtomicBoolean
读取和写入都使用compareAndSet
语义执行会怎样?
你能根据 Java 内存模型论证你的立场吗?
UPD:请System.out.println("n=" + n)
视为只是阅读n
. 对于v
.
UPD2:您能否对 JSR-133 sec 中所示的第 1 和第 4 种情况进行一些分析。8?