此文已由作者赵计刚授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
注:本文主要参考自《深入理解Java虚拟机(第二版)》和《深入理解Java内存模型》
1、Java内存模型(JMM)
Java内存模型的主要目标:定义在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
注意:上边的变量指的是共享变量(实例字段、静态字段、数组对象元素),不包括线程私有变量(局部变量、方法参数),因为私有变量不会存在竞争关系。
1.1、内存模型就是一张图:
说明:
注意:
类比:(注意:主内存与工作内存只是一个概念,与堆栈内存没有关系,下边的类比只是帮助理解)
1.2、8条内存屏障指令:
下面只列出6条与之后内容相关的,其余的查看《深入理解Java虚拟机》
下边四条是与volatile实现内存可见性直接相关的四条(store、write、read、load)
注意:
2、变量对所有线程的可见性
可见性:线程1对共享变量的修改能及时被线程2看到
2.1、共享变量不可见的原因
2.2、实现共享变量及时更新的措施
线程1修改过共享变量后,将共享变量刷到主内存,然后,线程2从主内存读取该共享变量,将该共享变量载入到工作内存中
注意:在短时间内的高并发情况下,如果发生下列三种情况,则线程2就读不到线程1修改过的最新的值了,
注意:工作内存中的变量副本在使用之后,不会立刻消失掉,会一直存在,这样其值也一直不变,直到对其进行写操作或数据从CPU中刷新回来(类比volatile-read的作用)。
2.3、指令重排序:代码书写顺序与实际执行顺序不同(编译器或处理器为提高程序性能做的优化)
eg.
书写代码的顺序如下:
1 int a = 12; 2 int b = 13; 3 int c = a+b;
可能实际执行代码的顺序如下:
1 int b = 13; 2 int a = 12; 3 int c = a+b;
总结:本文大概介绍了一下Java内存模型以及与共享变量可见性的一些概念,为下边的volatile做准备。
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。