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

它说,在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命令的动作才能产生所需/所需的记忆效应(即提升缓存状态).

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

上一篇:在java中Set元素的同步


下一篇:java – android游戏循环中的同步