它说,在JLS17.4.4中
Every execution has a synchronization order. A synchronization order is a total order over all of the synchronization actions of an execution.
我知道什么是总订单.我知道需要订购同步动作.但令我困惑的是为什么它是所有同步操作的总顺序.例如,监视器m上的解锁操作发生在m上的所有后续锁定操作之前.但如果同时在监视器n上有一个锁定动作,是否需要在监视器m上的解锁动作后进行订购?如果没有,那么为什么所有同步动作都有总订单?谢谢.
解决方法:
好问题.虽然我不确定答案,但我认为最符合我理解的解释是肯定的,两个不同的锁之间存在“同步顺序”,因为JLS 17.4.2将“同步顺序”所描述的操作定义为必须是线程间的(因此一个线程必须在另一个线程接收之前调度该动作).
但是,这里有一个问题:
Synchronization actions induce the synchronized-with relation on actions, defined as follows […]
只有synchronized-with命令的动作才能产生所需/所需的记忆效应(即提升缓存状态).
所以基本上虽然所有的“同步动作”都遵循“同步顺序”(因此也就是“总顺序”),但只有那些同步模式才对线程安全有效.