JMM通过内存屏障来实现内存的可⻅性以及禁⽌重排序。 为了程序员的⽅便理解,提出了happens-before,它更加的简单易懂,从⽽ 避免了程序员为了理解内存可⻅性⽽去学习复杂的重排序规则以及这些规则 的具体实现⽅法。
那么什么是happens-before?
happens-before是Java内存模型(JMM)中的一个概念,它用于描述一个操作(事件)在另一个操作之前发生。在JMM中,如果操作A happens-before 操作B,那么操作A对共享内存的修改将对操作B可见,即操作B看到操作A的结果。
happens-before有以下几种规则:
-
程序次序规则(Program Order Rule):一个线程内,按照代码顺序,前面的操作先行发生于后面的操作。
-
锁定规则(Lock Rule):一个unlock操作先行发生于后面对同一个锁的lock操作。
-
volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作先行发生于后面对这个变量的读操作。
-
传递性(Transitive):如果操作A先行发生于操作B,操作B先行发生于操作C,那么操作A先行发生于操作C。
-
线程启动规则(Thread Start Rule):一个线程的start()方法先行发生于该线程的每一个动作。
-
线程终止规则(Thread Termination Rule):一个线程的所有动作都先行发生于该线程的终止检测。
-
线程中断规则(Thread Interruption Rule):对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。
-
对象终结规则(Finalizer Rule):一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。
具体是什么?
- 程序的顺序性规则:程序中的每个操作,happens-before于该线程中的任意后续操作。
- volatile变量规则:对一个volatile变量的写操作,happens-before于后续对该变量的读操作。
- 传递性:如果操作A happens-before操作B,操作B happens-before于操作C,那么可以得出操作A happens-before于操作C。
- 锁规则:一个unlock操作,happens-before后续的lock操作。这意味着对于同一个锁,解锁的操作一定先于加锁的操作。
- 线程启动规则:Thread对象的start()方法happens-before该线程的所有操作。
- 线程终止规则:线程的所有操作,happens-before于其他线程检测到该线程已经终止(即Thread.isAlive()返回false)。
- 线程中断规则:对线程interrupt()方法的调用happens-before于被中断线程的代码检测到中断事件的发生。
- 对象终结规则:一个对象的初始化完成(构造函数执行结束)happens-before于它的finalize()方法的开始。