锁的内存语义

锁的内存语义

锁的释放与获取所建立的happen-before关系

锁的释放与内存语义

锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息

volatile的内存语义

volatile读写所建立的happens-before关系

volatile读写的内存语义

public class Demo2 {

    private int a;
    private volatile boolean flag;

    public void writer(){
        a = 1; //1
        flag = true; //2
    }

    public void reader(){
         if(flag){ //3
            int b = a +1; //4
            System.out.println(b); //5
        }

    }

}

2.当写一个volatile变量时,Java内存模型会把该线程对应的本地内存中的共享变量刷新到主内存

3.当读一个valatile变量时,Java内存模型会把当前线程对应的本地内存中的共享变量置为无效,然后从主内存中读取共享变量

final域的内存语义

写final域的重排序规则

禁止把final域的写 重排序到构造方法之外

java 内存模型禁止编译器把final域的写重排序到构造方法之外

编译器会在final域的写之后,在构造方法执行完毕之前,插入一个内存屏障StoreStore,保证处理器把final 域的写操作在构造方法中执行

读final域的重排序规则

在一个线程中,初次读对象引用和初次读该对象所包含的final 域,java内存模型禁止处理器重排序这两个操作

final域为静态类型

final域为抽象类型

在构造方法内对一个final引用的对象的成员域的写入,与随后在构造方法外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序

原文地址:https://www.cnblogs.com/quyangyang/p/11216303.html