我试图理解Java内存模型方面的“顺序一致性”。 JLS的定义,第17章对我来说并不清楚。
如果我错了,我会给出我的愿景,纠正我。具有一个线程顺序一致性的程序意味着如果action1在程序顺序中位于action2之前,则action2应该看到action1的结果。
有两个主题。
线程1:
action1
action2
线程2:
action3
action4
如果action3
看到action2
的结果,则应该看到action1
的结果。
答案 0 :(得分:4)
你是对的;顺序一致性意味着每个操作都以原子方式执行,并且对所有线程都立即可见。就好像您将所有线程交织到一个线程中,逐个执行操作。
请注意,顺序一致性不是Java内存模型实际工作的方式。
引自17.4.3, Programs and Program Order:
如果我们使用顺序一致性作为我们的内存模型,我们讨论过的许多编译器和处理器优化都是非法的。
答案 1 :(得分:0)
一个线程顺序一致性意味着如果action1在程序顺序中位于action2之前,则action2应该看到action1的结果。
这是正确的,没有这个原则就不可能编程。
如果action3看到action2的结果,那么它也应该看到action1的结果。
如果不使用volatile
或锁定,就没有这样的保证。例如,action1可以更新一个缓存行,action2可以更新另一个缓存行。当发生这种情况时,无法确定何时,或者第二个线程是否会看到这些更改。