happens-before 原则和 as-if-serial 语义是JMM中的重要概念,它们都与程序执行的顺序性和一致性有关,但它们的焦点和适用范围有所不同。
happens-before 原则是 Java 内存模型(JMM)的一部分,用于确定多线程环境中操作之间的顺序关系。它确保在一个线程中的操作在“逻辑上”先于另一个线程中的操作时,第一个线程的操作结果对第二个线程是可见的。
happens-before原则主要用于多线程环境,确保线程间的内存可见性和有序性。如在一个线程中对 volatile 变量的写操作 happens-before 另一个线程对同一 volatile 变量的读操作。
✅synchronized是如何保证原子性、可见性、有序性的?
As-if-serial 语义是一种保证单线程程序的行为就像代码按顺序执行一样的概念。它允许编译器和处理器进行优化(如指令重排),但优化不能改变程序执行的最终结果。
as-if-serial语义保证了单线程中,指令重排是有一定的限制的,而只要编译器和处理器都遵守了这个语义,那么就可以认为单线程程序是按照顺序执行的。当然,实际上还是有重排的,只不过我们无须关心这种重排的干扰。
所以由于synchronized修饰的代码,同一时间只能被同一线程访问。那么也就是单线程执行的。所以,可以保证其有序性。