happens - before 原则是 JMM 中用于判断命据是否存在竞争、线程是否安全的紧张规则。如果操作 A happens - before 操作 B,那么操作 A 的执行效果对操作 B 是可见的,并且操作 A 的执行顺序在操作 B 之前。不外必要注意的是,这里的 “顺序” 并非严格的时间先后顺序,而是强调操作效果的可见性。
原理
happens - before 原则的焦点在于保障多线程情况下的有序性和可见性。它并不要求前一个操作在时间上肯定先于后一个操作执行,而是着重于前一个操作的效果对后一个操作是可见的。例如,在多线程情况中,大概会存在指令重排序的情况,但只要满足 happens - before 原则,就不会影响步调的正确性。
要点
步调顺序规则:在一个线程内部,每个操作 happens - before 该线程中恣意后续操作。这包管了单线程步调的执行顺序符合代码的编写顺序。
监视器锁规则:对一个锁的解锁操作 happens - before 随后对这个锁的加锁操作。这确保了在同一时刻只有一个线程可以或许访问被锁掩护的代码块,并且线程在释放锁后,其他线程可以或许看到该线程对共享变量所做的修改。