8

JLS 中,第 17.4.5 节。Happens-before Order,它说

当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。

它只给我们关于“顺序一致”的定义,它没有给我们关于“顺序一致执行”的定义。只有在知道什么是“顺序一致的执行”之后,我们才能进一步讨论这个话题。

那么什么是“顺序一致的执行”以及什么是“顺序一致的执行没有数据竞争”?

4

4 回答 4

4

执行有一个非常简单的正式定义:它只是对正在考虑的所有内存操作集的总排序。

顺序一致的执行由顺序一致的动作的任何总排序表示。

JLS 也精确定义了“无数据竞争”一词。

请注意,JLS 不需要顺序一致性。事实上,happens-before的整个形式主义的存在是为了精确定义顺序不一致的执行可以维持顺序一致性错觉的术语。

于 2012-08-18T12:18:42.143 回答
1

sequentially consistent executions基本上意味着对变量的每个读取操作都会看到对该变量的最后一次写入操作,无论在哪个线程或处理器上执行读/写操作。

但是,JLS 不保证开箱即用的顺序一致性。程序员必须通过适当的同步来实现这种一致性。如果没有同步,线程可能会看到不适当的数据,例如同时被另一个线程修改的数据。这被称为“数据竞赛”。

于 2012-08-18T12:09:49.520 回答
1

为确保两个操作不存在数据竞争,您必须使用§17.4.5中指定的五个条件中的任何一个在两个操作之间建立发生前的关系,并在内存一致性属性中进行了概括。一旦你这样做了,你的程序就与这两个动作正确同步了。该程序的所有执行似乎都是顺序一致的,您可以放心地忽略§17.4.3 中允许的任何重新排序。节目和节目顺序

于 2012-08-18T12:36:05.510 回答
0

1)顺序一致的执行(按定义):任何执行的结果都与所有处理器的操作都按某种顺序执行一样,并且每个单独的处理器的操作按照指定的顺序出现在该顺序中它的程序

2)数据竞争是并发操作访问共享内存位置的情况,其中至少一个是写入。

3)因此,如果执行顺序不一致,它们的结果将与程序结果不同,或者会表现出意外的行为。我们不想要这样的处决。

4)如果假设有一个seq。反对。没有数据竞争的执行,则意味着该序列存在另一个分支。反对。重新排序数据竞争点中的访问并导致不同的程序结果的执行。然后,这些执行与程序的顺序不一致,或者

5)程序允许seq。反对。执行具有违反直觉的行为和意外结果,因此未正确同步。

于 2018-07-14T18:17:03.753 回答