Warm tip: This article is reproduced from serverfault.com, please click

java-顺序一致性易失性解释

(java - Sequential consistency volatile explanation)

发布于 2017-10-23 12:37:51

我正在从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();
    }
}
Questioner
gstackoverflow
Viewed
12
Aleksey Shipilev 2017-10-24 21:30:33

你可以为此代码构造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是总阶,而总阶是反对称的,这里我们有对称的。我们已经陷入矛盾,因此不存在这种处决。优质教育