Happen-Before规则

98 阅读1分钟

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
    }
}

image.png

线程A加锁 解锁之后,临界区得数据会刷新到主存类似于一个store内存屏障,线程B加锁会使缓存中数据失效重新从内存拉去数据,类似一个 load内存屏障,所以线程B 可以拿到线程A 对 value值得修改,保证了内存得可见性。

监视锁规则不会对临界区内的代码进行约束,临界区内的代码可以重排序(但JMM不允许临 界区内的代码“逸出”到临界区之外,那样会破坏监视器的语义)