首页 > 应用开发 > Java > Java内存模型简介
| 首先要明确内存模型指什么。书中的定义是:在特定的操作协议下,对特定内存和高速缓存进行读写访问的过程抽象。 |
可以知道,内存模型就是来规定如何对内存/缓存进行读写操作的。所以Java内存模型,就是用来定义程序对Java内存的的访问规则。进一步说, Java内存模型就是定义程序中变量(静态变量、数组对象元素等,不包括局部变量、方法参数)的访问规则。
具体变量从主内存到工作内存,以及从工作内存转回主内存的实现细节,由下面八个原子性的操作完成:
同时还对上述八个操作进行了一些细节的要求,比如read/load、store/write必须成对出现,未执行过lock的变量不能执行unlock操作等。
划重点,此处面试常遇到的问题就是对于volatile关键字的解读。
此关键字修饰的变量具有两种效果:1、保证线程间的可见性;2、阻止指令重排序
对于1的实现,它保证load与use必须相邻调用,即要use这个变量,必定先执行read/load,这样每次都能获取到最新的变量值;它又保证asign与store必须相邻调用,即在工作内存中将该变量改了之后,必定会先同步到主内存中。这样,volatile关键字实现了可见性。至于阻止指令重排序,还是移步《深入理解Java虚拟机》一书吧,贫道水平有限,就不在这里说了。
从另一个角度来分析,Java内存模型是围绕着在并发过程中如何处理原子性、可见性、有序性来建立的。
原子性:八个原子性操作,以及synchronized(lock/unlock未直接开放给用户,synchronized通过monitorenter跟monitorexit指令调用的lock/unlock操作)
下面说说happens-before先行发生原则,先行发生原则用通俗语言表述就是:如果操作A在操作B之前发生,那么A产生的影响B同样能观测到。那么问题来了,先行发生原则都有哪些呢?同样有八条,如下:
Java内存模型基本就这些内容,如果都掌握了的话,非一线互联网公司基本都能应对自如了(因为一线互联网公司贫道本人也没进去><)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31559985/viewspace-2656703/ ,如需转载,请注明出处,否则将追究法律责任。