2

我试图在 Java 内存模型方面理解“顺序一致性”。JLS第17章的定义对我来说不是那么清楚。

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

有两个线程。

线程1:

action1
action2

线程2:

action3
action4

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

4

2 回答 2

6

你是对的; 顺序一致性意味着每个动作都是原子执行的,并且对所有线程立即可见。就好像您将所有线程交错到一个线程中,一个一个地执行操作。

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

引用17.4.3,程序和程序顺序

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

于 2012-11-06T09:01:06.523 回答
1

一个线程顺序一致性意味着如果 action1 在程序顺序中出现在 action2 之前,那么 action2 应该看到 action1 的结果。

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

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

没有使用volatile或锁定就没有这样的保证。例如 action1 可以更新一个缓存行,而 action2 可以更新另一个。当这种情况发生时,无法保证第二个线程何时或是否会看到这些更改。

于 2012-11-06T09:04:37.447 回答