java内存模型个人理解总结
现阶段线程之间的通讯主要有两种:内存共享和消息传递,而且在java中是采用的内存共享。简单说下内存共享:
假设现在有a线程和b线程,在a和b线程之间的通讯是依靠a线程将相关数据刷新到共享内存,然后b线程再通过从共享内存中读取数据来实现a线程和b线程的通讯,java中的共享内存就是堆,在堆中存储实例、静态参数和数组元素。
java内存模型如下(本地内存并不实际存在,涵盖了缓存和寄存器等优化性能的临时存储设计):
而到到这里又引发了一个新的问题,就是重排序的问题,我们知道在现在硬件和软件发展下,从cpu和java编译器上都采取了很多优化措施来保证程序的高效率执行,而重排序就是这一优化的一部分。不难想象,在重排序过程中两个线程a和b代码如下:
public class Demo{
int a=0,b=0,x=0,y=0;
public void methodA(){
a = 10;
x = b;
}
public void methodB(){
b = 10;
y = a;
}
}
假设a和b同时运行,而在methodA和methodB中两行代码并没有明确的相关性,这时候就可能发生重排序,在a运行methodA和b运行methodB并发状态下会出现x=0;b=0;的情况,因为methodA和methodB中可能都会出现先执行x=b;和y=a;的情况而a和b是基于共享内存通信的,这时并不能正确指导参数a和b是否正确初始化。这时就会引入我们所说的锁的概念,再加入锁的基础上(例如方法加入synchronized)如a获得锁,则必须等到methodA执行完才会s释放锁,这时候methoB才会执行,这样就和我们预料的结果一样了.在解除锁的情况下会将最新的运算值刷新到共享内存中,获得锁的时候也会获取最新的共享内存中的值,这其实就完成了线程a和线程b的通信。(ps:即便是没有重排序操作也可能会发生线程a活着线程b没有及时将新的值刷入内存的情况)
而在其他的例如volitale也是在读写上建立了可见性,任何对volitale的读取操作都获取最新上一次的写操作结果,volitale写操作会将最新的值刷入共享内存,volitale读操作则会读取共享内存中的最新值。
java内存模型个人理解总结的更多相关文章
- java 内存模型的理解
之前一直在实习,博客停写了一段时间,现在秋招开始了,所以辞职回来专心看书,同时将每天的收获以博客的形式记录下来.最近在看jvm相关的书籍,下面对面试中问得最多的部分--java 内存模型. 本篇博客大 ...
- java内存模型JMM理解整理
什么是JMM JMM即为JAVA 内存模型(java memory model).因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且 ...
- java内存模型深入理解
作为一个java程序员 jvm 虚拟机应该是最先接触的了,但是当初由于理解能力有限一直没搞明白是怎么回事,而是将他理解为运行java程序的环境,不过这也没错.但是随着工作时间的增加开始思考jvm里面工 ...
- 全面理解Java内存模型(JMM)及volatile关键字(转载)
关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoad ...
- 全面理解Java内存模型(JMM)及volatile关键字
[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...
- 全面理解Java内存模型(JMM)及volatile关键字(转)
原文地址:全面理解Java内存模型(JMM)及volatile关键字 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型( ...
- java内存模型原理阅读总结
Java内存模型可以理解为在特定操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象.不同架构的物理计算机可以有不一样的内存模型,java虚拟机也有自己的内存模型,java虚拟机规范中试图定义一种 ...
- 并发之初章Java内存模型
>>>>>>博客地址<<<<<< >>>>>>首发博客<<<<< ...
- 硬件内存模型到 Java 内存模型,这些硬核知识你知多少?
Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你 ...
随机推荐
- python是如何进行内存管理的
Python引入了一个机制:引用计数. python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时, ...
- ASP.NET MVC中URL末尾斜杠的实现
在网站的SEO优化中,通常都会涉及到URL结尾斜杠的问题. http://blog.sina.com.cn/s/blog_828e7ce40100srj1.html http://www.dengyo ...
- 40个Java多线程问题
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...
- Spring配置补充
# :Spring配置补充 ## 一:灵活配置DataSource (1) 使用属性文件配置数据源 (2) 使用JNDI数据源 (3) Spring中的Bean的作用域问题, Sin ...
- 自定义view-滑动开关
介绍 前段时间,我看到了一篇关于可滑动开关Switch组件的文章,效果图如下: 思路也挺简单的:这个控件主要由田径场式背景和滑块组成.他将田径场式背景分为3部分,最左边的半圆,中间的两条直线部分和最右 ...
- vim如何显示行号
在 vim 里执行(在普通模式下直接按冒号,并输入下面的命令 :set number 回车后就可以显示行号了,但重启 vim 后又会恢复默认的设置. 要想每次进入 vim 都显示行号就需要配置 vim ...
- [转载] java多线程学习-java.util.concurrent详解(四) BlockingQueue
转载自http://janeky.iteye.com/blog/770671 ------------------------------------------------------------- ...
- JS小游戏:贪吃蛇(附源码)
javascript小游戏:贪吃蛇 此小游戏采用的是面向对象的思想,将蛇,食物,和游戏引擎分为3个对象来写的. 为方便下载,我把js写在了html中, 源码中暂时没有注释,等有空我在添加点注释吧. 游 ...
- JavaScript的兼容
兼容总结 如果两个都是属性,用逻辑 || 做兼容 如果有一个是方法,用三元做兼容 如果多个属性或方法,封装函数做兼容 获取class属性值的兼容 function getClass (obj){ if ...
- PHP+Redis 实例【一】点赞 + 热度 上篇
这次的开篇,算是总结下这段时间来的积累吧,废话不多说,直接干! 前言 点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql(写了几百行的代码都还没写完,有毒)啦 数据库直接 ...