On lzq ways

Java内存模型

2019-04-27  本文已影响4人  zhengqiuliu

一,内存模型的概念

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关系,向正在编译的目标方法中插入相应的读读,读写,写读以及写写内存屏障。

上一篇下一篇

猜你喜欢

热点阅读