Java 如何理解同步顺序,即总顺序?

Java 如何理解同步顺序,即总顺序?,java,multithreading,synchronization,Java,Multithreading,Synchronization,在JLS中,它说 每次执行都有一个同步顺序。同步顺序是执行的所有同步操作的总顺序 我知道什么是总订单。我知道需要对同步操作进行排序。但让我困惑的是,为什么它是所有同步操作的总顺序。例如,监视器m上的解锁操作发生在m上所有后续锁定操作之前。但是,如果同时在监视器n上有一个锁定操作,是否需要在监视器m上的解锁操作之后订购?如果不是,那么为什么所有同步操作都有一个总的顺序?谢谢。好问题。虽然我不确定答案,但我认为最符合我理解的解释是肯定的,两个不同锁之间存在“同步顺序”,因为“同步顺序”将描述为有序的

在JLS中,它说

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


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

好问题。虽然我不确定答案,但我认为最符合我理解的解释是肯定的,两个不同锁之间存在“同步顺序”,因为“同步顺序”将描述为有序的操作定义为必须是线程间的(因此,一个线程必须在另一个线程收到该操作之前发出该操作)

然而,这里有一个陷阱:

同步操作会在操作上产生synchronized with关系,定义如下[…]

只有由synchronized with命令的操作才会产生所需/所需的内存效果(即,提升缓存状态)


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

首先,非常感谢您的回答。我认为您的观点启发了我。以下是我的想法:从17.4.3开始”如果所有操作以与程序顺序一致的总顺序(执行顺序)发生,则一组操作是顺序一致的。"而且JMM在语义上是顺序一致的,这是通过同步操作同步比赛数据来保证的。因此,同步操作有一个总的顺序来确保JMM的顺序一致性。我在这里理解的总顺序是关于同步操作的可见性。这是对它的总结。理论上它是有用的想到JMM这样工作,事实上我真的想不出这样一个小细节会有什么用处;线程间操作的这种行为甚至可能不是JMM的副作用,但更可能是当今大多数CPU缓存的工作方式(如果我错了,请纠正我).无论如何,如果你觉得这个细节对你的职业、项目或诸如此类的事情有帮助,我很想和你分享:)