Happen-before规则
Happens-Before(先行发生)规则,并且确保只要两个Java语句 之间必须存在Happens-Before关系,JMM尽量确保这两个Java语句之间的内存可见性和指令有序性
主要说一下监视锁规则
class VolatileReorderDemo2 {
int x = 10;
int doubleValue = 0;
boolean flag = false;
public synchronized void update() {
value = 100; //1
flag = true; //2
}
public synchronized void doubleX() {
if (flag) //3
{
double value = x + x; //4
}
}
线程A加锁 解锁之后,临界区得数据会刷新到主存类似于一个store内存屏障,线程B加锁会使缓存中数据失效重新从内存拉去数据,类似一个 load内存屏障,所以线程B 可以拿到线程A 对 value值得修改,保证了内存得可见性。
监视锁规则不会对临界区内的代码进行约束,临界区内的代码可以重排序(但JMM不允许临 界区内的代码“逸出”到临界区之外,那样会破坏监视器的语义)