如何理解总订单的同步顺序?

时间:2017-06-15 11:09:30

标签: java multithreading synchronization

在JLS 17.4.4中,它说

  

每次执行都有一个同步顺序。同步顺序是执行的所有同步操作的总顺序。

我知道什么是总订单。我知道需要订购同步动作。但令我困惑的是,为什么它是同步操作的 ALL 的总顺序。例如,在 m 上的所有后续锁定操作之前,监视器 m 上的解锁操作发生。但如果同时在监视器 n 上有锁定操作,是否需要在监视器 m 上的解锁操作后进行订购?如果没有,那么为什么所有同步动作都有总订单?谢谢。

1 个答案:

答案 0 :(得分:2)

好问题。虽然我不确定答案是肯定的,但我认为最符合我理解的解释是肯定的,两个不同的锁之间存在“同步顺序”,因为JLS 17.4.2定义了所描述的行为“同步命令“必须是线程间的(因此一个线程必须在另一个线程接收之前调度该动作)。

但是,这里有一个问题:

  

同步操作会在操作中引发 synchronized-with 关系,定义如下[...]

只有同步的操作才会产生所需/所需的内存效果(即提升缓存状态)。

所以基本上虽然所有的“同步操作”都遵循“同步顺序”(因此也就是“总顺序”),但只有那些 synchronized-with 模式才对线程安全有效。