JMM中的happens-before概念

设计的初衷

  • 程序员写代码时,是要求内存模型易于理解和易于编程,并且我们也希望程序能按照我们编写的代码一样,能按规则编写顺序执行。(强内存模型,即强规则的内存模型)
  • 对于编译器和处理器的实现来说,它们希望约束尽量少一些,所以编译器和处理器会对指令进行重排,让他们尽己所能的优化来提供性能。(弱内存模型)

程序员希望JMM提供给我们一个强内存模型,而底层的编译器和处理器需要一个弱内存模型来提高自己的性能。

所以JMM向我们程序员提供了足够强的内存可见性保证,只要不改变程序的执行结果,编译器和处理器想怎么优化就怎么优化,所以JMM在一些地方对编译器和处理器进行了约束,以确保可见性。

happens-before

在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。

happens-before使用的地方

happens-before的出现地方:

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;
  • 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作;
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;
  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;
  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
  • 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;

JMM中的happens-before相关推荐

  1. JMM中的happens-before原则

    目录 引言 1.先行发生原则说明 2.happens-before总原则 3.happens-before之8条 4.happens-before小总结 引言 在JMM中,如果一个操作执行的结果需要对 ...

  2. JMM中的原子性、可见性、有序性和volatile关键字

    相信如果对JMM底层有过了解或者接触过java并发编程的读者对以上的概念并不陌生,但是真正理解的可能并不多.这里我就对这些概念再做一次讲解.相信读者多读几遍应该就有自己的理解,实在不理解也没关系,说明 ...

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

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

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

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

  5. Java并发 -- JMM

    文章基于jdk1.7,通过学习<Java并发编程的艺术>,对Java内存模型的理解 并发编程模型的两个关键问题 线程之间如何通信 线程之间如何同步 上面所说的线程指的是并发执行的活动实体. ...

  6. Java内存模型(Java Memory Model,JMM)

    导读 本文通过对JSR133规范的解读,详细的介绍JMM的核心理论,并将开发中常用的关键字的实现原来做了详细的介绍.通过本文读者可以了解到并发的一些基本理论,并对一些同步原语有了更深层次的理解.希望读 ...

  7. java float内存结构_Java后端开发岗必备技能:Java并发中的内存模型

    欢迎关注专栏: Java架构技术进阶 .里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. JMM通过构建一个统一的内存模型来屏蔽掉不同硬件平台和不同操作系统之间的差异,让Jav ...

  8. JMM内存模型如何为并发保驾护航

    一.为何引入JMM 每个处理器在执行任务时,不可能单靠"计算"就可以完成所有任务,处理器至少需要和内存交互,进行读取运算数据.存储运算结果等,这个I/O操作是很难消除掉的.但由于计 ...

  9. 什么是Java内存模型中的happens-before

    Java内存模型JMM Java内存模型(即Java Memory Model , 简称JMM),本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序个各个变量(包括实 ...

最新文章

  1. 使用群集保障SQL Server 2005的高可用性(2)
  2. 网站推广——网站推广专员从蜘蛛角度出发如何进行网站优化
  3. git/码云上关于项目的一些操作:初始化、克隆、上传修改等
  4. Symbian编程总结-图形图像篇-直接屏幕访问
  5. Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String
  6. 十、input与跳转
  7. oracle如何获取自增id,oracle实现自增id
  8. java partialfunction,Java Relation.partialFunction方法代碼示例
  9. su室外渲染参数设置_紫天资源星球下载:多层公寓楼室外Lumion预渲染场景
  10. 热门事件和书籍中资料管理中国
  11. java 执行oracle命令_利用oracle存储过程执行操作系统命令
  12. 详解斯坦纳点及斯坦纳树及模版归纳总结
  13. Hadoop (一) Hadoop学习
  14. word中使用通配符替换【持续更新系列】
  15. UG/NX二次开发配置
  16. tomcat一次升级后启动报错的解决,IllegalArgumentException: AJP连接器配置secretRequired=“true“
  17. VTA(Versatile Tensor Accelerator)阅读笔记
  18. 鸿蒙内核手机,华为和安卓说再见,推出鸿蒙内核手机,不再更新安卓
  19. 网站 502 解决方法
  20. BAPI_ALM_ORDER_MAINTAIN 修改维修工单组件示例

热门文章

  1. 段错误调试神器 - Core Dump详解
  2. ES权威指南[官方文档学习笔记]-8
  3. C语言技巧之长度为0的数组
  4. Javascript 笔记(1)----函数
  5. WPF 与Surface 2.0 SDK 亲密接触 - 图形缩放篇
  6. Spring工具类ToStringBuilder用法简介
  7. Android调用WebService
  8. Struts 动态Form的验证框架步骤
  9. Nginx反向代理,负载均衡,redis session共享,keepalived高可用
  10. MySQL查看SQL语句执行效率和mysql几种性能测试的工具