锁的内存语义
锁的内存语义
锁的释放与获取所建立的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引用的对象的成员域的写入,与随后在构造方法外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序