gpt4 book ai didi

java - 顺序一致性volatile解释

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:38 27 4
gpt4 key购买 nike

我正在观看 java jpoint session 的视频。

我对以下来自 Alexey Shipilev 的幻灯片有疑问报告:

enter image description here

请原谅我的非英语幻灯片。实际上作者说变量集是不可能的

r1 = 1 (Y)
r2 = 0 (x)
r3 = 1 (x)
r4 = 0 (Y)

根据视频,他暗示这很明显。

有人可以阐明为什么根据 JMM 不可能设置这个值吗?

附言

如果我理解 Alexey 符号是正确的,它遵循以下代码:

public class SequentialConsistency {
static volatile int x;
static volatile int y;

public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
x = 1;
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
y = 1;
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("r1=" + x + ", r2=" + y);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("r3=" + x + ", r4=" + y);
}
}).start();
}
}

最佳答案

您可以为此代码构建详尽的 SC 执行列表,并且实现没有 SC 执行 yield (1, 0, 1, 0)。

在模型方面,很容易争论。同步顺序 (SO) 一致性表示同步读取应该看到 SO 中的最后同步写入。 SO-PO 一致性表示 SO 应该与程序顺序一致。

这允许通过反证法勾勒出证明。假设产生 (1, 0, 1, 0) 的执行存在。然后,由于 SO 的一致性,在那些读取到零的执行中必须按以下顺序:

(r2 = x):0 --so--> (x = 1)  [1]
(r4 = y):0 --so--> (y = 1) [2]

...另外两个读取必须按此顺序与写入才能看到它们(由于 SO 一致性):

(x = 1) --so--> (r3 = x):1  [3]
(y = 1) --so--> (r1 = y):1 [4]

...此外,由于 SO-PO 一致性:

(r1 = y):1 --po--> (r2 = x):0  [5]
(r3 = x):1 --po--> (r4 = y):0 [6]

这会产生奇怪的循环传递 SO:

(r2 = x):0 --so--> (r3 = x):1 --so--> (r4 = y):0 --so--> (r1 = y):1 --so--> (r2 = x):0
[1,3] [6] [2,4] [5]

请注意,对于上面执行中的任何一对 Action A != B,我们可以说 (A --so--> B)(B --so--> A) -- 这称为对称性。根据定义,SO 是全序,全序是反对称,这里我们有对称的。我们已经到了矛盾的地步,因此这种处决是不存在的。 Q.E.D.

关于java - 顺序一致性volatile解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889610/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com