Java 顺序一致性

Java 顺序一致性,java,multithreading,Java,Multithreading,我试图从Java内存模型的角度来理解“顺序一致性”。JLS第17章的定义对我来说不太清楚 我会给出我的愿景,如果我错了,请纠正我。使程序具有单线程顺序一致性意味着,如果在程序顺序中action1位于action2之前,那么action2应该看到action1的结果 有两条线的 线程1: action1 action2 线程2: action3 action4 如果action3看到action2的结果,那么它也应该看到action1的结果。你是正确的;顺序一致性意味着每个操作都以原子方式执行

我试图从Java内存模型的角度来理解“顺序一致性”。JLS第17章的定义对我来说不太清楚

我会给出我的愿景,如果我错了,请纠正我。使程序具有单线程顺序一致性意味着,如果在程序顺序中action1位于action2之前,那么action2应该看到action1的结果

有两条线的

线程1:

action1
action2
线程2:

action3
action4

如果
action3
看到
action2
的结果,那么它也应该看到
action1
的结果。

你是正确的;顺序一致性意味着每个操作都以原子方式执行,并且对所有线程都立即可见。这就像将所有线程交错到单个线程中,一个接一个地执行操作一样

请注意,顺序一致性不是Java内存模型实际工作的方式

引自:

如果我们使用顺序一致性作为内存模型,那么我们讨论的许多编译器和处理器优化都是非法的

单线程顺序一致性意味着如果action1在程序顺序中位于action2之前,那么action2应该看到action1的结果

这是正确的,没有这个原则,就不可能编程

如果action3看到action2的结果,那么它也应该看到action1的结果


如果不使用
volatile
或锁定,则不存在此类保证。例如,action1可以更新一条缓存线,action2可以更新另一条缓存线。发生这种情况时,无法保证第二个线程何时或是否会看到这些更改。

“顺序一致性”意味着我所写的内容适用于线程中的每个操作?JMM取而代之的是基于偶发事件之前的动作,这是一种偏序?是的,您所写的遵循顺序一致性规则,是的,JMM使用偶发事件之前的偏序。有趣的是,
volatile
确实提供了顺序一致性,但我在JLS@Eugene 如果一个程序没有数据竞争,那么该程序的所有执行看起来都是顺序一致的