Java 什么';s";顺序一致的执行不存在数据争用;?

Java 什么';s";顺序一致的执行不存在数据争用;?,java,memory-model,Java,Memory Model,实际上,它说 当且仅当所有顺序一致的执行都没有数据争用时,程序才正确同步 它只给了我们“顺序一致”的定义,没有给我们“顺序一致执行”的定义。只有在了解了什么是“顺序一致执行”之后,我们才能进一步讨论这个话题 那么什么是“顺序一致执行”和什么是“顺序一致执行没有数据竞争” 顺序一致的执行基本上意味着变量上的每个读操作都会看到该变量上的最后一次写操作,无论读/写操作在哪个线程或处理器上执行 但是,JLS不能保证开箱即用的顺序一致性。程序员必须通过适当的同步来实现这种一致性。如果没有同步,线程可能会看

实际上,它说


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


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


那么什么是“顺序一致执行”和什么是“顺序一致执行没有数据竞争”

顺序一致的执行
基本上意味着变量上的每个读操作都会看到该变量上的最后一次写操作,无论读/写操作在哪个线程或处理器上执行


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

执行有一个非常简单的形式化定义:它只是考虑中的所有内存操作集合的总顺序


顺序一致的执行由顺序一致的操作的总顺序表示

术语“无数据竞争”也由JLS精确定义


请注意,JLS不需要顺序一致性。事实上,所有的形式主义都是为了精确定义顺序不一致的执行可以保持顺序一致性的幻觉的术语,以确保两个操作没有数据竞争,您必须使用中指定的五个条件中的任意一个条件在两个操作之间建立关系,并在中进行概述。一旦您这样做,您的程序就与这两个操作正确同步。该程序的所有执行看起来都是顺序一致的,您可以安全地忽略。

1)顺序一致执行(按定义)中允许的任何重新排序:任何执行的结果都与所有处理器的操作都是按某个顺序执行一样,每个处理器的操作按其程序指定的顺序出现在这个序列中

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

3) 因此,如果执行顺序不一致,则其结果将与程序结果不同,或者将显示意外行为。我们不想要这样的处决

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


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

我对你的答案感到困惑,所以我可以修改你的定义如下:顺序一致的执行基本上意味着。。。按程序顺序在该变量上。如果我不正确,请指出。顺序一致执行基本上意味着变量上的每个读操作都会看到该变量上的最后一个写操作,其总执行顺序与程序顺序一致。我说的对吗?是的,这基本上是对的定义,因为所有操作都有一个总的顺序,同一线程中的操作遵循程序顺序,不同线程中的操作遵循总的顺序。我听说有人说顺序一致的执行只是在单CPU计算机中执行。我不确定这是不是真的。那你怎么看?这不是真的。即使只有一个CPU,也存在多线程和数据竞争的可能性。您能给我一个关于包含数据竞争的顺序一致执行的例子吗?非常感谢。对比。我得走了,第二天见。你能给我一个关于包含数据竞争的顺序一致执行的例子吗?非常感谢。这非常简单:全局
inti
由线程
t1
编写,然后由
t2
读取
t2
读取由
t1
写入的值,因此执行顺序一致。但是,在这些操作之间排序之前不会发生任何事件,因此存在数据竞争。请注意,之前发生的事件不会自动发生,因为这些事件有时间顺序。谢谢您的回复。再进一步,你能给我举个例子吗:一个程序的所有顺序一致的执行都是无数据竞争的,但是这个程序的正常执行包含数据竞争。非常感谢。我得走了,第二天见。没有这样的例子,这正是问题的关键:一个正确同步的程序可以在不引入数据竞争的情况下顺序不一致。这是所有编译器优化的基础。