Java内存模型
一,内存模型的概念
Java内存模型本质就是规范了JVM如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括volatile, synchronized 和 final 三个关键字,以及六项Happens-Before规则。
二,如何解决可见性,重排序问题
volatile声明的变量,就是告诉编译器,对这个变量的读写,不能使用CPU缓存,必须从内存中读取或者写入。
Happens-Before规则:前面一个操作的结果对后续操作都是可见的,为了保证线程之间的心灵感应。
1,程序的顺序性规则。
x=42 Happens-Before v=true, 这里x=42.程序前面对某个变量的修改一定是对后续操作可见的。
2,volatile变量规则。对一个volatile变量的写操作,Happens-Before于后续对这个volatile变量的读操作。
3,传递性。如果A Happens-Before B, && B Happens-Before C, 那么 A Happens-Before C。
4,管程中锁的规则。对一个锁的解锁 Happens-Before 后续对这个锁的加锁。管程是一种通用的同步原语,在Java中指的就是synchronized。
5,线程start()规则。指主线程A启动子线程B后,子线程B能够看到主线程A在启动子线程B前的操作。
6,线程join()规则。主线程A通过调用子线程B的join()方法实现,主线程A中join()方法返回,A能够看到B的操作。指对共享变量的操作
final: volatile为的是禁用缓存和编译优化,而final关键字则是告诉编译器优化得更好一些。
三,内存模型底层思想
Java内存模型是通过内存屏障来禁止重排序的。对于JVM即时编译器来说,它会针对每一个happens-before关系,向正在编译的目标方法中插入相应的读读,读写,写读以及写写内存屏障。