我正在从Java Jpoint会议观看视频。
我对以下来自Alexey Shipilev报告的幻灯片有疑问:
打扰一下,请不要打扰我。实际上,作者说不可能将变量集设置为
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执行收益(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]
注意,对于以上执行中的任何一对动作A!= B,我们都可以说(A --so--> B)
和(B --so--> A)
-这称为对称性。根据定义,SO是总阶,而总阶是反对称的,这里我们有对称的。我们已经陷入矛盾,因此不存在这种处决。优质教育
你能看一下吗stackoverflow.com/questions/56684150/…