"Happens-Before" 是Java内存模型中的概念,用于描述多线程程序中操作之间的顺序和可见性关系。它定义了一组规则,哪些操作具有可预测的行为。以下是"Happens-Before" 的八大规则:
-
程序顺序规则(Program Order Rule) :
在一个线程中,程序按照代码的顺序执行,这意味着一个线程中的操作会按照它们在源代码中的顺序执行。
-
锁定规则(Monitor Lock Rule) :
释放锁的操作(例如,通过
synchronized
块或Lock
接口)在获取同一个锁之前的所有操作都发生在获取锁之后的操作之前。 -
volatile变量规则(Volatile Variable Rule) :
对一个
volatile
变量的写操作会在后续对该变量的读操作之前发生。这确保了对volatile
变量的写入对于其他线程来说是可见的。 -
线程启动规则(Thread Start Rule) :
线程的
start()
方法在新线程开始执行之前,必须完成之前线程的所有操作。 -
线程终止规则(Thread Termination Rule) :
线程的所有操作必须在该线程终止之前完成。这包括线程中的任何
join()
方法的调用。 -
线程中断规则(Thread Interruption Rule) :
对线程的中断操作(
interrupt()
方法)必须在后续对线程的中断检查(例如,调用isInterrupted()
方法)之前发生。 -
对象终结规则(Finalizer Rule) :
一个对象的
finalize()
方法的调用发生在任何后续对该对象的操作之前。 -
传递性规则(Transitivity Rule) :
如果操作A发生在操作B之前,而操作B发生在操作C之前,那么操作A发生在操作C之前。这意味着"Happens-Before"关系具有传递性。
虽然"Happens-Before"关系定义了操作之间的顺序关系,但它不一定意味着操作的实际执行顺序。Java虚拟机和处理器可以根据性能和优化的需要重新排序指令,但必须确保不会违反"Happens-Before"规则。无需考虑底层硬件和虚拟机的细节。