Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 因果关系示例执行_Java_Multithreading_Memory_Concurrency - Fatal编程技术网

Java 因果关系示例执行

Java 因果关系示例执行,java,multithreading,memory,concurrency,Java,Multithreading,Memory,Concurrency,该链接给出了一个允许合法执行的示例。请参阅第26页第4.8.1节 例如 Initially, x = y = 0 Thread 1 Thread 2 r1 = x; r2 = y; y = 1; x = r2; r1 == r2 == 1 is a legal behavior 从纸上看 我们希望采取行动 r2=y 要查看值1。 C 1. 无法包含此操作 查看此值:既不向 Y 已经犯下的罪行。 C 2. 可能包含这个 行动;然而,阅读 Y 必须在中返回0 E 2. ,因为第6条。执

该链接给出了一个允许合法执行的示例。请参阅第26页第4.8.1节

例如

Initially,
x = y = 0
Thread 1  Thread 2
r1 = x;   r2 = y;
y = 1;    x = r2;
r1 == r2 == 1 is a legal behavior
从纸上看

我们希望采取行动 r2=y 要查看值1。 C 1. 无法包含此操作 查看此值:既不向 Y 已经犯下的罪行。 C 2. 可能包含这个 行动;然而,阅读 Y 必须在中返回0 E 2. ,因为第6条。执行 E 2. 因此与 E 1.
在里面 E 3. ,第7条, r2=y 可以看到在中发生的任何冲突写入 C 2. (只要 正如写入之前发生的一样(一致)。此操作现在可以看到1的写入 到 Y 在线程1中,在 C 1. . 我们在这方面还采取了一项行动 C 3. :1到1的写入 x 通过 x=r2

我们无法提交r2=y,其中y的值为1,因为根据规则6,读取y将返回0。但根据E3中下一个提交周期的论文,r2=y可以看到在Thread1中提交的值y=1。
我的疑问是,提交r2=y的执行E3也应该满足规则6,并且应该只看到之前发生的值,即x=0。为什么在E2中,由于规则6,在提交r2=y时,y只能将y值读取为0,而在E3中,在提交r2=y时,y可以读取在Thread1中写入的y=1

需要注意的最重要的一点是,规则7允许Ci中提交的读取在Ei中看到与在E中看到的写入不同的写入。但是,必须尽早解决此薛定谔读取问题。规则5确保这种读取必须在Ei+1中看到与在E中相同的写入

因此,如果您想让读取看到快速写入,那么不能在提交这两个操作的同一执行中执行。您需要等待下一次执行,并且需要确保竞速写入不会在订购之前发生(在我们的示例中,大多数情况下是在订购
y=0
r2=y
之前发生)

因此,您在C2中提交读取
r2=y
,在E2中它只看到写入
y=0
,因为写入发生在它之前,但在E3中,
r2=y
可以看到它无法建立的赛车写入发生在它之前

另一方面,该推理在以下几句话的阅读
r1=x
文章中进行了解释:

C4作为E4的一部分,包含read
r1=x
;由于规则6,它仍然看到0。在里面 然而,我们的最终执行E=E5,规则7允许
r1=x
查看C3中提交的1到
x
的写入