在JLS, §17.4.5. Happens-before Order中,它表示
当且仅当所有顺序一致的执行都没有数据争用时,程序才能正确同步。
它只给我们定义“顺序一致”,它没有给我们定义“顺序一致的执行”。只有在知道什么是“顺序一致的执行”之后,我们才可以进一步讨论该主题。
那么什么是“顺序一致的执行”以及“顺序一致的执行没有数据竞争”?
答案 0 :(得分:2)
执行有一个非常简单的正式定义:它只是对正在考虑的所有内存操作集的总排序。
顺序一致的执行由对顺序一致的动作的任何总排序表示。
“无数据竞赛”一词也由JLS精确定义。
请注意,JLS不需要顺序一致性。事实上,的整个形式发生在存在之前,以便精确定义顺序不一致的执行可以维持连续一致性错觉的术语。
答案 1 :(得分:1)
sequentially consistent executions
基本上意味着变量上的每个读操作都会看到该变量的最后一次写操作,无论在哪个线程或处理器上执行读/写操作。
但是,JLS并不能保证开箱即用的顺序一致性。程序员必须通过适当的同步来实现这种一致性。没有同步,线程可能会看到不适当的数据,例另一个线程同时修改的数据。这被称为"数据竞赛"。
答案 2 :(得分:1)
为了确保两个操作没有数据争用,您必须使用happens-before中指定的并在§17.4.5中重述的五个条件中的任何一个在这两个操作之间建立Memory Consistency Properties关系。完成后,您的程序正确同步就这两个操作而言。该程序的所有执行似乎都是顺序一致的,您可以放心地忽略§17.4.3. Programs and Program Order中允许的任何重新排序。
答案 3 :(得分:0)
1)顺序一致执行(按定义):执行的结果与所有处理器的操作均按某个顺序执行以及每个人的操作相同处理器按其程序指定的顺序依次出现
2)数据争用是并发操作访问共享内存位置的情况,其中至少一个是写操作。
3)因此,如果执行顺序出现的顺序不一致,则其结果将与程序结果不同或表现出意外的行为。而我们不希望这样的处决。
4)如果假设有一个序列。骗子如果执行过程中没有数据争用,则意味着存在该序列的另一个派生。骗子执行将对数据争用点中的访问进行重新排序,并导致不同的程序结果。然后,这些执行与程序顺序不一致,或者
5)程序允许序列。骗子执行过程具有违反直觉的行为和意外结果,因此无法正确同步。