什么是“顺序一致的执行没有数据竞争”?
在JLS中,§17.4.5。 发生在秩序之前 ,它说
当且仅当所有顺序一致的执行没有数据争用时,程序才能正确同步。
它只给我们定义“顺序一致”,它没有给我们定义“顺序一致的执行”。 只有在知道什么是“顺序一致的执行”之后,我们才可以进一步讨论该主题。
什么是“顺序一致的执行”以及什么是“顺序一致的执行没有数据竞争”?
执行有一个非常简单的forms定义:它只是对正在考虑的所有内存操作集的总排序。
顺序一致的执行由对顺序一致的动作的任何总排序表示。
JLS还精确定义了“无数据竞争”这一术语。
请注意,JLS不需要顺序一致性。 事实上, 之前发生的整个forms主义是为了精确定义顺序不一致的执行可以保持顺序一致性错觉的术语。
sequentially consistent executions
意味着基本上对变量的每个读操作都会看到对该变量的最后一次写操作,无论在哪个线程或处理器上执行读/写操作。
但是,JLS并不能保证开箱即用的顺序一致性。 程序员必须通过适当的同步来实现这种一致性。 如果没有同步,线程可能会看到不适当的数据,例如同时被另一个线程修改的数据。 这称为“数据竞争”。
要确保两个操作没有数据争用,您必须使用§17.4.5中指定的五个条件中的任何一个并在内存一致性属性中重现 ,在两个操作之间建立一个先发生关系。 一旦这样做,您的程序就这两个动作正确同步 。 该程序的所有执行似乎都是顺序一致的,您可以放心地忽略§17.4.3中允许的任何重新排序。 计划和计划订单 。
1) 顺序一致执行(通过def。):任何执行的结果都与所有处理器的操作按某种顺序执行相同,并且每个处理器的操作按照指定的顺序出现在此序列中它的计划
2) Data Race是并发操作访问共享内存位置的情况,其中至少一个是写入。
3)因此,如果执行顺序不一致,则其结果将与程序结果不同或将显示意外行为。 这样的执行我们不想要。
4)如果假设有seq。 CON。 执行不是没有数据竞争,那么它意味着存在这个seq的另一个分支。 CON。 执行,它重新排序数据竞争点中的访问并导致不同的程序结果。 然后,这些执行不是顺序与程序一致,或
5)程序允许seq。 CON。 执行具有违反直觉的行为和意外结果,因此未正确同步。