目录

  • happen-before是什么
    • happen-before出现的原因
    • happen-before的七条原则
    • happen-before的传递性

happen-before是什么

happen-before出现的原因

为了明确定义多线程场景下重排序的问题,Java引入了JMM(Java Memory Model),也就是Java内存模型。如果有了重排序就会出现原子性,可见性,有序性的问题,但是性能会提升。所以Java内存模型不是真实存在的,而是一套规范,可以方便的使开发者在运行效率和程序开发的方便性之间找到一个平衡点。

一方面要让CPU和编译器可以灵活的进行重排序,另一方面也要告诉开发者,在什么情况下什么样的重排序不需要感知,需要感知什么样的重排序并作出处理。

为了描述这个规范,JMM引入了happen-before,使用happen-before描述两个操作之间的内存可见性

简单来说,happen-before的意思就是,如果 操作A happen-before 操作B,那么操作A的执行结果必须对操作B可见。

happen-before的七条原则

  1. 单线程规则:同一个线程中的每个操作都happens-before于出现在其后的任何一个操作。
  2. 对一个监视器的解锁操作happens-before于每一个后续对同一个监视器的加锁操作。
  3. 对volatile字段的写入操作happens-before于每一个后续的对同一个volatile字段的读操作。
  4. Thread.start()的调用操作会happens-before于启动线程里面的操作。
  5. 一个线程中的所有操作都happens-before于其他线程成功返回在该线程上的join()调用后的所有操作。
  6. 一个对象构造函数的结束操作happens-before与该对象的finalizer的开始操作。
  7. 传递性规则:如果A操作happens-before于B操作,而B操作happens-before与C操作,那么A动作happens-before于C操作。

happen-before的传递性

就像七条原则里的第七条,happen-before具有传递性,否则的话岂不是要将所有的可能出现可见性问题的变量都要用volatile修饰。

实例

class A{private int a = 0;private volatile int c = 0;public void set(){a = 5; //操作1c = 1;    //操作2}public int get(){int d = c;  //操作3return a;  //操作4}
}

上述代码中,由于七条原则中的第一条:单线程规则,所以操作1 happen-before 操作2。由于变量c使用了volatile关键字进行修饰,所以操作2 happen-before 操作3。

所以由于传递性可以推出:操作1 happen-before 操作2 happen-before 操作3 happen-before 操作4

这样一来,操作1结果必须对操作4可见,但是如果没有使用volatile关键字修饰变量c,就不会有这样的关系,那么在先调用set方法后调用get方法时,就可能得不到值

happen-before是什么相关推荐

  1. James Fee’s 5 Predictions Geo for 2010 and 5 Things That Won’t Happen

    Here are 5 predictions for Twenty Ten. The shapefile dies: SpatiaLite + ESRI's File Geodatabase API ...

  2. 干货 | 诚迈科技联合联发科技、Linaro推出《Make it happen!联发科技曦力X20开发板技术公开课(上海站)》精彩回顾

    2016年12月10日,由AlphaSTAR极客社区主办的<Make it happen!联发科技曦力X20开发板技术公开课>在上海完美落幕.联发科技.Linaro及诚迈科技热力助阵,电子 ...

  3. React中遇到的Bug——Unhandled Rejection (Error): Maximum update depth exceeded. This can happen when a com

    Error: Maximum update depth exceeded. This can happen when a component repeatedly calls setState ins ...

  4. Functions are not valid as a React child. This may happen if you return a Component instead of 「Comp

    控制台报错 Functions are not valid as a React child. This may happen if you return a Component instead of ...

  5. English trip V1 - 6.Accidents Happen! 发生意外! Teacher:Corrine Key: 过去进行时 was or were + Ving...

    In this lesson you will learn to talk about past occurences. 过去进行时 课上内容(Lesson) C: Hi, Loki! L: Hi, ...

  6. this can happen if layout contains custom windows and there are comple errers in the project解决方案

    this can happen if layout contains custom windows and there are comple errers in the project 解决方案: 1 ...

  7. Functions are not valid as a React child. This may happen if you return a Component instead of

    报错信息:Functions are not valid as a React child. This may happen if you return a Component instead of ...

  8. 【happen before】

    jvm内置的,保证先后逻辑关系的保障. jvm在设计的时候,将提前可知的先后逻辑关系的程序,内置jvm中. 例子: new 对象;对象清理:我们不可能写个if语句去判断是否对象创建完了没有.

  9. Dissecting BERT Part 1: The Encoder 解析BERT解码器(transformer)

    原文:https://medium.com/dissecting-bert/dissecting-bert-part-1-d3c3d495cdb3 A meaningful representatio ...

  10. BERT大火却不懂Transformer?读这一篇就够了 原版 可视化机器学习 可视化神经网络 可视化深度学习...20201107

    20211016 调节因子 20211004 [NLP]Transformer模型原理详解 - 知乎 论文所用 20210703 GPT模型与Transformer进行对比_znevegiveup1的 ...

最新文章

  1. ajax 折叠,ASP.NET AJAX可折叠面板Accordion应用实例
  2. JAVASCRIPT干了不下四五种工作
  3. python 虚线_Python 包安装和管理工具 pip 19.2 发布
  4. php分销根据上级id获取上级姓名,无限级分销系统查自己上级、下级之多叉树实现关系速查...
  5. sharepoint portal server 2003--入门资料
  6. Android获取半透明属性
  7. 【转】自动化专业十大看家课程
  8. asp.net基于net的体检信息管理系统-计算机毕业设计
  9. 1188: 选票统计(一)(结构体专题)
  10. 语音识别 特征提取(一)
  11. 手机如何远程控制挂机宝? 影云挂机宝
  12. 偷学三太子敖丙的功力
  13. 投资组合风险收益率公式_投资组合分析的基础收益和亏损
  14. 大学计算机基础网络应用第二套,大学计算机基础)应用指导(第2版
  15. 传统的人事管理与人力资源管理有什么区别,后者有了什么新突破?
  16. 判断map的key的value是否为空
  17. 基于php学生信息管理系统设计
  18. java做一个远程桌面程序
  19. 西门子S7-1200控制5轴伺服程序案例 PTO伺服轴脉冲定位控制功能应用+速度模式应用+扭矩模式应用
  20. String你真的会吗?不会还不进来!!!是等我胖虎锤各位呢?!!!

热门文章

  1. python爬虫 点击下一页,总结python爬虫抓站的实用技巧 python爬虫怎么获取下一页的url...
  2. 2017兰州高中计算机考试时间,兰州2017年中考考试时间安排
  3. python卡方拟合性检验_卡方检验
  4. Android后台播放音乐(含通知栏操作)
  5. HYPERLEDGER FABRIC-CA学习
  6. python高级进阶_20_进程之间的通信之queue(Poo演示)
  7. 【小白到大牛之路】-开发环境搭建
  8. 智能合约实现简单投票系统
  9. 利用QVOD架设流媒体服务器/电影服务器/vod服务器
  10. java 时间显示毫秒_Java程序以毫秒为单位显示日期和时间