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上的线程都能读取到这些数据的最新版本

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

转载于:https://www.cnblogs.com/vingLiu/p/10677428.html

什么是Java内存模型中的happens-before相关推荐

  1. 【JAVA】Java 内存模型中的 happen-before

    前言 Java 语言在设计之初就引入了线程的概念,以充分利用现代处理器的计算能力,这既带来了强大.灵活的多线程机制,也带来了线程安全等令人混淆的问题,而 Java 内存模型(Java Memory M ...

  2. Java内存模型中的三个代

    http://developer.51cto.com/art/200909/153154.htm 本文介绍Java内存模型中的三个代:年轻代,终身代以及永久代.文中图示了各个代的默认排列.本文适用于J ...

  3. Java 内存 关系_发生在Java内存模型中的关系之前

    (1) What does it really mean by saying "ordered before"? Because even if action_a happens- ...

  4. java if在内存中_全面理解Java内存模型

    Java 内存模型的抽象 在 java 中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用"共享变量"这个术语代指实例域,静态域和数组元素).局部变量( ...

  5. java happen-before_java 内存模型中的happen-before 是什么?

    happen-before 关系,是Java内存模型中保证多线程可见性的机制,也是对早期语言规范中含糊的可见性概念的一个精确定义. 它的具体表现形式,包括但远不止测试我们直觉中的 synchroniz ...

  6. Java——聊聊JUC中的Java内存模型(JMM)

    文章目录: 1.CPU缓存模型 2.Java内存模型Java Memory Model 3.JMM规范下的三大特性 3.1 原子性 3.2 可见性 3.3 有序性 4.JMM规范下,多线程对变量的读写 ...

  7. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

  8. java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

    第12章 Java内存模型与线程 前言: 1.物理机如何处理并发问题? 2.什么是Java内存模型? 3.原子性.可见性.有序性的具体含义和应用实现? 4.volatile 关键字特性? 5.基于vo ...

  9. Java内存模型与线程

    一.一致性 高速缓存的存储交互很好的解决了处理器与内存的速度矛盾,但也存在缓存一致性(cache coherence)问题 二.java内存模型 内存模型:对特定的内存或高速缓存进行读写访问的过程抽象 ...

最新文章

  1. JSP笔记-发送邮件
  2. bootsrap+jquery+组件项目引入文件的常见报错
  3. C++ 11 nullptr关键字
  4. k8s核心技术-命令行工具kubectl---K8S_Google工作笔记0017
  5. 运行linux的配置,Linux系统运行级别配置
  6. 数学建模美赛E题数据获取
  7. Caliburn.Micro WPF教程——入门
  8. 基于C++的教师信息管理系统
  9. HLA高层体系结构+RTI(2)
  10. login.keyring的问题
  11. c++ 将行列式化为上三角行列式,并求值。
  12. DEC6713开发板的摸索(1)
  13. Spring-Mybatis整合 第一个Spring-Mybatis程序
  14. X 国王有一个地宫宝库-dfs
  15. 在matlab中理解采样定理
  16. JS 实现 图片幻灯片 效果。 兼容 FF IE
  17. ECharts x,y轴分别添加自定义的滚动条
  18. Uni-app框架UniPush安卓消息推送模拟配置
  19. 中国地震局监测司与多个省份地震局台网中心信息化负责人莅临云创
  20. WIN10打印机如何连接到计算机,win10电脑怎么添加打印机,教您电脑如何添加打印机的方法...

热门文章

  1. PHP中的foreach循环
  2. 用VIM打造C语言编写器
  3. 几步在Eclipse离线安装propedit插件
  4. MySQL优化--where条件字段的顺序对效率的影响 (02)
  5. Centos7 下Redis3安装
  6. 让Windows命令行显示UTF-8字符
  7. [InnoDB系列] -- SHOW INNODB STATUS 探秘
  8. 剑指Offer:剪绳子(动态规划、贪婪算法)
  9. html粘贴excel内容,如何用JS解析剪切板里的excel内容
  10. 离线轻量级大数据平台Spark之MLib机器学习库概念学习