什么是Java内存模型中的happens-before
Java内存模型JMM
Java内存模型(即Java Memory Model , 简称JMM),本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序个各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式

由于JVM运行时程序的实体是线程,而每个线程创建时,而JVM都会为其创建一个工作内存,有一些地方叫做栈空间,用于存储线程私有的数据,而Java内存模型中规定所有的变量都保存在主内存中,主内存是共享内存区域,所以线程都可以访问。但线程对变量的操作,则读取和赋值等,必须在工作内存中进行。首先从主内存中拷贝变量到工作内存中,然后对变量进行操作,操作完成后,再将变量写回到主内存中。注意:线程是不能直接操作主内存的变量,工作内存中就存在主内存变量的副本。因此每个线程都不能互相访问对方的工作内存,所以线程之间的通信必须通过主内存去进行通信。
JMM中的住内存和工作内存
JVM中的主内存
1、存储Java实例对象
2、包括成员变量、类信息、常量、静态变量等
3、属于数据共享的区域,多线程并发操作时会引发线程安全问题
JVM中的工作内存
1、存储当前方法的所有本地变量信息,本地变量对其他线程不可见
2、字节码行号指示器,Native方法信息
3、属于线程私有数据区域,不存线程安全问题
JMM与Java内存区域划分是不同的概念层
1、JMM描述的是一组规则,围绕原子性,有序性,可见性展开
2、相似点:存在共享区域和私有区域
主内存与工作内存的数据存储类型以及操作方式归纳
1、方法里的基本数据类型本地变量将直接存储在工作内存的栈帧结构中
2、引用类型的本地变量:引用存储在工作内存中,实例存储在主内存中
3、成员变量、static变量、类信息均会被存储在主内存中
4、主内存共享的方式是线程各拷贝一份数据到工作内存,操作完成后刷新回主内存

指令重排序需要满足的条件
1、在单线程环境下不能改变程序运行的结果
2、存在数据依赖关系的不允许重排序
无法通过happens-before原则推导出来的,才能进行指令的重排序
A操作的结果需要对B操作可见,则A与B存在happens-before关系


volatile : JVM提供的轻量级同步机制
1、保证被volatile修饰的共享变量对所有线程总是可见的
2、禁止指令重排序优化
volatile的可见性
1、注意,不是线程安全的,只是可见

另外一种写法:

volatile变量为何立即可见?
1、当些一个volatile变量时,JMM会把该线程对应的工作内存中的共享变量值刷新到主内存中
2、当读取一个volatile变量时,JMM会把该线程对应的工作内存设置为无效
volatile如何禁止重排优化
内存屏障
1、保证特定操作的执行顺序
2、保证某些变量的内存可见性
通过插入内存屏障指令禁止在内存屏障前后的指令执行重排序优化
强制刷出各种cpu的缓存数据,因此任何CPU上的线程都能读取到这些数据的最新版本


上面的操作,看上去没有问题,但是还是有隐患,有可能会有指令重排序之后,导致的问题。


什么是Java内存模型中的happens-before的更多相关文章
- (第三章)Java内存模型(中)
一.volatile的内存语义 1.1 volatile的特性 理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步.下面通过具体 ...
- 深入理解Java内存模型中的虚拟机栈
深入理解Java内存模型中的虚拟机栈 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启 ...
- Java内存模型中volatile关键字的作用
volatile作用总结: 1. 强制线程从公共内存中取得变量的值,而不是从线程的私有的本地内存中,volatile修饰的变量不具有原子性(修改一个变量的值不能同步). 2. 保证volatile修饰 ...
- java内存模型中工作内存并不一定会同步主内存的情况分析
其实是为了填之前的一个坑 在一个多线程的案例中出现了阻塞的情况. https://www.cnblogs.com/hetutu-5238/p/10477875.html 其中的第二个问题,即多个 ...
- 浅析java内存模型--JMM(Java Memory Model)
在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...
- JMM(java内存模型)
What is a memory model, anyway? In multiprocessorsystems, processors generally have one or more laye ...
- Java内存模型深度解析:final--转
原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...
- Java内存模型深度解析:volatile--转
原文地址:http://www.codeceo.com/article/java-memory-4.html Volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特 ...
- Java内存模型
1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题 ...
随机推荐
- PTA 4-4 先序输出叶结点 【基础题】
//二叉树的叶结点:度为0的结点. void PreorderPrintLeaves( BinTree BT ) { if(BT==NULL) //如果传下来根节点就是空,直接返回: return; ...
- CodeForces 665B 【水-暴力】
题意(来自网络): 现在有k件商品,每个商品的位置已经告诉你了 现在有n个人,每个人有m个需求,每个需求就是要把第a[i][j]个物品拿到第一个位置来 他的代价是pos[a[i][j]] 问你所有代价 ...
- JavaScript之——对象Object(一)
1. 新建对象.删除和访问: (1).新建 var obj1 = {b: 2}; //对象文本表示法 var obj2 = new Object(); obj2.a = 1; (2).访问 //第一种 ...
- 一种Unity2D多分辨率屏幕适配方案
http://www.cnblogs.com/flyFreeZn/p/4073655.html 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏 ...
- bzoj 4464: [Jsoi2013]旅行时的困惑【贪心】
据说正解是有上下界最小流,但是这种1e5的玩意问什么要跑网络流啊-- 贪心即可,注意一点是可以有多条路径经过一条边-- 以1为根,设d[u][0/1]为u到父亲的边是向下/向上,g记录这个点儿子中不能 ...
- 2013 Noip提高组 Day1
3285 转圈游戏 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description ...
- 浏览器插件--TamperMonkey
可以在此插件中添加一些脚本: 1,破解VIP会员视频集合,目前里里面的 “石头解析“,”无名小站“,”vip看看 ”可以解析爱奇艺等的视屏网站的会员视频 // ==UserScript== // @n ...
- 洛谷 P1463 [HAOI2007]反素数
https://www.luogu.org/problemnew/show/P1463 注意到答案就是要求1-n中约数最多的那个数(约数个数相同的取较小的) 根据约数个数的公式,在约数个数相同的情况下 ...
- 解决thymeleaf严格html5校验的方法
用的是springboot加thyemleaf做静态模板. 然后会有个很烦的东西,就这个静态模板对html的格式非常严格,导致很多框架的格式都用不了,然后这里有个解除的方法: 1.在pom中添加依赖: ...
- corn表达式 经典
https://www.cnblogs.com/GarfieldTom/p/3746290.html