特殊POPL问题的数据竞争示例Java内存模型混乱

特殊POPL问题的数据竞争示例Java内存模型混乱,java,java-memory-model,Java,Java Memory Model,我对POPL特刊《Java内存模型》中的图3感到困惑 示例(第5页,图3): 解释1(第5页,第1.2节): 因果循环的另一个例子——这次是描述可接受行为的例子——如图3所示。为了查看结果,其中一个线程必须先执行写操作,然后再执行读操作。但每一次书写似乎都取决于上面的读数。虽然这个值似乎也是凭空产生的,但它不是,也可能是标准编译器转换的结果,如第2.2.2节所述 解释2(第10页,2.2.2依赖性打破分析和转换): 图3显示了一个类似但更令人惊讶的行为。在这种情况下 编译器必须执行更深入的分析才

我对POPL特刊《Java内存模型》中的图3感到困惑

示例(第5页,图3):

解释1(第5页,第1.2节): 因果循环的另一个例子——这次是描述可接受行为的例子——如图3所示。为了查看结果,其中一个线程必须先执行写操作,然后再执行读操作。但每一次书写似乎都取决于上面的读数。虽然这个值似乎也是凭空产生的,但它不是,也可能是标准编译器转换的结果,如第2.2.2节所述

解释2(第10页,2.2.2依赖性打破分析和转换): 图3显示了一个类似但更令人惊讶的行为。在这种情况下 编译器必须执行更深入的分析才能确定这一点 x和y的值保证为0或1。一种可能的分析 将是确定表示整数所需的位宽度的分析 程序中的值[Stephenson等人,2000]

在此示例中,如果x或y==1,则r1和r2可以是
==1
x或y可以是==1
如果r1和r2==1
。但是
1
的赋值只能在
r3=r2 | 1中找到1
转换为
r1
r2
x
y


那么,这个例子是错的还是我错了?

你是对的。这个例子是错误的。应该是:

Initially, x == y == 0
Thread 1 -> r1 = x; y = r1;
Thread 2 -> r2 = y; r3 = r2 | 1; x = r3;

您可以在的图1.3中看到正确的示例。

您是对的。这个例子是错误的。应该是:

Initially, x == y == 0
Thread 1 -> r1 = x; y = r1;
Thread 2 -> r2 = y; r3 = r2 | 1; x = r3;
您可以在的图1.3中看到正确的示例