目录

引言

1.先行发生原则说明

2.happens-before总原则

3.happens-before之8条

4.happens-before小总结


引言

在JMM中,如果一个操作执行的结果需要对另一个操作可见性或者代码重排序, 那么这两个操作之间必须存在happens-before(先行发生)原则。也就是逻辑上的先后关系。

1.先行发生原则说明

如果Java内存模型中所有的有序性都仅靠volatile和synchronized来完成,那么有很多操作都将会变得丰常啰嗦,但是我们在编写Java并发代码的时候并没有察觉到这一点。

我们没有时时、处处、次次,添加volatile和synchronzed来完成程序,这是因为Java语中JMM原则下有一个“先行发生"(Happens-Before)的原则限制和规矩,给你立好了规则!

这个原则非常重要:
它是判断数据是否存在竞争,线程是否安全的非常有用的手段。 依赖这个原则,我们可以通过几条简单规则一揽子解决并发环境下两个操作之间是否可能存在冲突的所有问题,而不需要陷入Java内存模型苦涩难懂的底层编译原理之中。

2.happens-before总原则

如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。(如,值日:周一张三周二李四,假如有事调班也是可以的;1+2+3=3+2+1,不影响结果)

3.happens-before之8条

1.次序规则:一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作。

加深说明:

前一个操作的结果可以被后续的操作获取。讲白点就是前面一个操作把变量x赋值为1,那后面一个操作肯定能知道X已经变成1。

2.锁定规则:一个unlock操作先行发生于后面(这里的“后面”是指时间上的先后)对同一个锁的lock操作。

3.volatile变量规则:对 一 个volatile变量的写操作先行发生于后面对这个变量的读操作,前面的写对后面的读是可见的, 这里的“后面”同样是指时间上的先后。

4.传递规则:如果操作A先行发生于操作B, 而操作B又先行发生于操作C, 则可以得出操作A先行发生于操作C。

5.线程启动规则(Thread Start Rule):Thread对象的stert()方法先行发生于此线程的每一个动作。

6.线程中断规则(Thread Interruption Rule):对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;可以通过Thread.interrupted()检测到是否发生中断,也就是说你要先调用interrupt()方法设置过中断标志位,我才能检测到中断发送。

7.线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过isAlive()等手段检测线程是否已经终止执行。

8.对象终结规则(Finalizer Rule):一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。

4.happens-before小总结

在Java语言里面,Happens-Before的语义本质上是一种可见性。

A Happens-Before B意味着A发生过的事情对B来说是可见的,无论A事件和B事件是否发生在同一个线程里。

JMM的设计分为两部分:
一部分是面向我们程序员提供的,也就是happens-beforen规则,它通俗易懂的向我们程序员阐述了一个强内存模型,我们只要理解happens-beforen原则,就可以编写并发安全的程序了。

另一部分是针对JVM实现的,为了尽可能少的对编译器和处理器做约束从而提高性能,JMM在不影响程序执行结果的前提下对其不做要求,即允许优化重排序。我们只需要关注前者就好了,也就是理解happens-beforen则即可,其它繁杂的内容有JMM规范结合操作系统给我们搞定,我们只写好代码即可。

JMM中的happens-before原则相关推荐

  1. 设计模式中的开闭原则

    Table of Contents 1 设计模式中的开闭原则 1.1 基本原则 2 模式中的开-闭原则 2.1 策略模式 2.2 简单工厂 2.3 工厂方法 2.4 抽象工厂 2.5 建造者模式 2. ...

  2. JMM中的happens-before

    JMM中的happens-before概念 设计的初衷 程序员写代码时,是要求内存模型易于理解和易于编程,并且我们也希望程序能按照我们编写的代码一样,能按规则编写顺序执行.(强内存模型,即强规则的内存 ...

  3. 浅谈数学中的化归原则

    浅谈数学中的化归原则 泸职院信息工程学院 华卫(1999.6.6) 摘要: 能力比知识更重要:数学教育中使学生掌握数学思想方法,对于促进他们能力的发展至关重要:化归原则是数学中一种很重要的思想方法:本 ...

  4. 里氏替换原则——举例说明Java设计模式中的里氏替换原则

    里氏替换原则--举例说明Java设计模式中的里氏替换原则 1. 前言 官方定义: 2. 举例说明 2.1 例子介绍 2.2 反例 2.2.1 类图说明 2.2.2 代码说明 2.2.3 测试 2.2. ...

  5. 技术管理工作中的三个原则

    技术管理工作中的三个原则 我们在工作中常常会遇到的三个原则:闭环原则.谁难受,谁推进原则.Think Bigger原则. 一.闭环原则 作为一个管理者,这是非常重要的.你应该起到上传下达的作用,你要让 ...

  6. 分布式存储系统关于GDPR条例中的数据清除原则

    文章目录 前言 HDFS存储系统数据的完全删除 基于加解密的输入输出流的数据保护方案 引用 前言 关于GDPR是什么,可能许多同学之前并不太了解,至少笔者在之前也是不清楚的.GDPR全称为通用数据保护 ...

  7. 知道焊缝长度如何确定节点板尺寸_钢桁架节点图 中各尺寸确定原则 总结

    本帖最后由 webyl 于 2011-11-24 18:58 编辑9 ^9 q% @% ]$ o! e, S ) W+ L" V( D9 J8 j 节点图中各尺寸确定原则 1.节点板尺寸 节 ...

  8. C# 实例解释面向对象编程中的单一职责原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  9. 怎么做极简ui设计?UI界面设计中的极简原则【萧蕊冰】

    怎么做极简ui设计?近几年,互联网的飞速发展引起了科技领域的巨大浪潮,UI设计行业需求大量专业优秀人才,吸引了很多想要学习UI设计的人.UI设计也就是用户界面的设计,作为引导用户快速正确使用产品的主要 ...

最新文章

  1. 你想见的大神都来AI ProCon 2019了,优惠票限时抢购开启!
  2. 科隆(Koln)一日游
  3. 码栈开发手册(三)---编码方式开发(高级课程①)
  4. 【DND图形库】二、创建控制台窗口和游戏循环
  5. c语言malloc calloc,C语言内存管理:malloc、calloc、free的实现
  6. zabbix proxy mysql_zabbix proxy 配置
  7. keil5按F12调不出头文件中函数
  8. oracle 10g分区表,oracle10g-11gR2 分区表汇总一
  9. impdp 不兼容_oracle - Oracle:使用impdp导入数据库转储时出错:Data Pump客户端与数据库版本12.1.0.2.0不兼容 - 堆栈内存溢出...
  10. 【谷粒商城】集群篇-k8s(4/4)
  11. 技嘉z77主板msata速度_z77-d3h_技嘉z77d3h说明书_技嘉z77 d3h msata
  12. PicGo搭建图床避坑
  13. 新年新气象,牛年更牛,开始新的征程
  14. win7电脑怎么提升开机速度
  15. 【python与excel】
  16. 《OKR:源于英特尔和谷歌的目标管理利器》读书笔记
  17. android pak文件_android 文件读写I/O 大集合 (持续更新)
  18. python修改Jenkins job的参数默认值
  19. Spring Security 之 Remember-Me (记住我)
  20. TiDB 4.0 升级 5.1 二三事——避坑指南

热门文章

  1. 51job(前程无忧官网)1万条招聘信息的爬取
  2. 没做过几个项目,简历怎么写啊
  3. 【技术选型】Elasticsearch vs. Solr-选择您的开源搜索引擎
  4. [bzoj4942][noi2017]整数【线段树】
  5. 让debian支持ll命令
  6. 计算机如何添加usb平板电脑,平板电脑怎么连接电脑 最有效方法【图解】
  7. 英特尔® 实感™ SDK R4 (v.6.0) 的全新特性
  8. Java中类数组,创建后使用set函数,报NullPointerException空指针异常
  9. java 数据库连接池的maxIdle该如何配置(转载非我原创)备忘
  10. 删除排序链表中的重复元素 II