2017-06-15 137 views
3

在JLS 17.4.4,它说如何理解总订单的同步订单?

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

我知道什么是总订单。而且我知道同步操作需要订购。但是,这里让我困惑的是为什么它是ALL的同步操作的总订单。例如,在监视器m上的解锁动作发生在m的所有后续锁定动作之前。但是,如果同时显示器上有锁定动作n,是否需要在显示器上的解锁动作后订购m?如果不是,那么为什么所有的同步操作都有一个总的顺序?谢谢。

回答

1

伟大的问题。虽然我不知道答案是肯定的,但我认为最符合我理解的解释是,在两个不同的锁之间存在“同步顺序”,因为JLS 17.4.2将描述为按“同步顺序”排序的操作定义为必须是线程间的(并且因此一个线程必须在另一个线程接收它之前调度该动作)。

然而,这里的渔获:

同步操作诱导同步,与行动关系,定义如下[...]

只有通过行动synchronized-有序与产生所需/期望的记忆效应(即提前缓存状态)。

所以基本上,虽然所有的“同步行动”遵循“同步命令,”(因此“总序),但只有那些同步,与模式是有效的线程安全。

+0

首先,我真的很感谢你的回应,我认为你的观点已经启发了我,我正在考虑的是:从17.4.3“如果所有动作都是以全部顺序(执行顺序)发生,这与程序的顺序是一致的“,而且JMM语义上是顺序一致的,这是通过同步动作来同步竞争数据来保证的,所以同步动作总有一个顺序来确保JMM的顺序一致性。订购这里是关于同步操作的可见性。 –

+0

总结一下。虽然理论上认为JMM的工作方式很有用,但实际上我真的不能想到这样一个细节会有用的地方;线程间行为以这种方式表现的事实可能不是JMM的副作用,但更可能是现今大多数CPU缓存工作的方式(如果我错了,请纠正我)。无论哪种方式,如果您觉得这些细节对您的职业或项目或者其他方面有用,我会很好奇你分享:) – xTrollxDudex