java并发内存模型
java中线程之间的共享变量存储在主内存(java堆)中,每个线程都有一个私有的本地内存,本地内存存储了该线程以读、写共享变量的副本。本地内存是一个抽象概念,并不真实存储。它涵盖了cache,寄存器记等等。
线程之间的通信
线程之间的通信采用的是共享内存的方式,整个通信的过程由JMM(java内存模型)来控制的。线程A与线程B之间要通信必须要经历下面两个过程:
- 线程A把本地内存A中更新过的共享变量刷新到主内存中去
- 线程B到主内存中读取线程A之前已更新过的共享变量
重排序
java编译器/解释器为了优化程序代码重排序。我们先来看一个例子:
public class Test {
static boolean flag = true;
static float money = 0f;
public static void main(String[] args) {
flag = false;
money = 0.5f;
new Thread() {
@Override
public void run() {
test();
}
}.start();
}
static void test() {
while (!flag)
Thread.yield();
System.out.println("money == " + money);
}
}
上面的代码要么输出"money==0.5"(几率很小很小),要么什么都不输出。这是因为编译器可能将flag = false和money = 0.5f进行的重排序。即money = 0.5f出现在了flag=false的前面。这样的话,当mony=0.5f时发生了线程切换,test方法得到了执行。而这是flag值是为true的,所以输出了"money == 0.5"。那么这样的话,我们写的代码得不到控,是不是很无奈。不用担心,JMM提出了happens-before机制。
happens-before
hanppens-before是JMM对程序员做出的保证的。
在一个线程中前一个操作对后一个操作是可见的
a=3;
a=5;
这种操作是前后有依赖性的。先a赋值为3,后又改成5。不管这两行代码将来重排序后,前后顺序发生如何变化,JMM对程序员做出的保证是a=3先执行,a=5后执行。但是向a=3,b=6; 这种前后没有依赖关系的就不能保证执行顺序了。
同一个对象的解锁操作,对其加锁是可见的
加锁和解锁多发生于多线程中,如果对一个对象进行的解锁操作,那么对这个对象的加锁操作一定是可见的。意思是对一个对象的进行解锁操作,则对该对象进行加锁操作时一定能加锁成功的。
如果A happens-before B,且B happens-before C,那么A happens-before C
volatile字段的写入操作happens-before于每一个后续的同一个字段的读操作
java并发内存模型的更多相关文章
- 掌握Java的内存模型,你就是解决并发问题最靓的仔
摘要:如果编写的并发程序出现问题时,很难通过调试来解决相应的问题,此时,需要一行行的检查代码,这个时候,如果充分理解并掌握了Java的内存模型,你就能够很快分析并定位出问题所在. 本文分享自华为云社区 ...
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
- Java虚拟机内存模型及垃圾回收监控调优
Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...
- 全网最硬核 Java 新内存模型解析与实验单篇版(不断更新QA中)
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
- Java线程内存模型-JVM-底层原理
public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) t ...
- C++11并发内存模型学习
C++11标准已发布多年,编译器支持也逐渐完善,例如ms平台上从vc2008 tr1到vc2013.新标准对C++改进体现在三方面:1.语言特性(auto,右值,lambda,foreach):2.标 ...
- java String 内存模型
关于java的内存模型,参照以下的一篇文章: https://isudox.com/2016/06/22/memory-model-of-string-in-java-language/
- Java虚拟机--内存模型与线程
Java虚拟机--内存模型与线程 高速缓存:处理器要与内存交互,如读取.存储运算结果,而计算机的存储设备和处理器的运算速度差异巨大,所以加入一层读写速度和处理器接近的高速缓存来作为内存和处理器之间的缓 ...
- Java对象内存模型
2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...
随机推荐
- leetcode 153: Majority Element
Given an array of size n, find the majority element. The majority element is the element that appear ...
- Java千百问_05面向对象(011)_引用传递和值传递有什么差别
点击进入_很多其它_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给还有一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 比如: //定义 ...
- smarty 总结和分析
虽然smarty现在已经废弃不用,但是它的原理我们需要了解一下,这也是TP框架的一部分原理,它把前后端分离开,这样前端只需要写静态网页,后端只需要处理数据库和php文件就可以了,phpcms的思路也大 ...
- python基础之3
1,列表可以嵌套任何东西.包括字典,列表等 字典是无序的健值型,不需要下标,也可以嵌套列表和字典 2,集合:对列表进行差异化处理后形成集合,特点:去重和无序.主要作用: (1)去重;(2) 关系测试, ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- [ Office 365 开发系列 ] 前言
前言 本人从接触Microsoft SharePoint Server 2007到目前为止,已经在微软SharePoint的路上已经走了好几年,基于SharePoint平台的特殊性,对微软产品线都有了 ...
- Django--20170905--笔记
一.django的安装 1.先安装python 2.再安装django:pip install django 3.使用虚拟环境:pip install virtualenv 二.项目的创建 1.可以先 ...
- jQuery table tr隔行变色,鼠标移入移出变色,鼠标点击变色
.trover { background: #f9f9f9; } .trclick { background: #c4e8f5; } .treven{ background:#CCFFCC; } .t ...
- DHCP服务原理
DHCP 工作原理 一.什么是DHCP? DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server),68(DHCP ...
- Java Filter过滤xss注入非法参数的方法
http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...