为什么80%的码农都做不了架构师?>>>   

先行发生原则(Happens-Before)是判断数据是否存在竞争、线程是否安全的主要依据。

先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影响能够被操作B观察到。

口诀:如果两个操作之间具有happen-before关系,那么前一个操作的结果就会对后面的一个操作可见。是Java内存模型中定义的两个操作之间的偏序关系。

常见的happen-before规则:

1.程序顺序规则:一个线程中的每个操作,happen-before在该线程中的任意后续操作。(注解:如果只有一个线程的操作,那么前一个操作的结果肯定会对后续的操作可见。)

2.锁规则:对一个锁的解锁,happen-before在随后对这个锁的加锁。(注解:这个最常见的就是synchronized方法和syncronized块)

3.volatile变量规则:对一个volatile域的写,happen-before在任意后续对这个volatile域的读。该规则在CurrentHashMap的读操作中不需要加锁有很好的体现。

4.传递性:如果A happen-before B,且B happen-before C,那么A happen - before C.

5.线程启动规则:Thread对象的start()方法happen-before此线程的每一个动作。

6.线程终止规则:线程的所有操作都happen-before对此线程的终止检测,可以通过Thread.join()方法结束,Thread.isAlive()的返回值等手段检测到线程已经终止执行。

7.线程中断规则:对线程interrupt()方法的调用happen-before发生于被中断线程的代码检测到中断时事件的发生。

总结:一个操作“时间上的先发生”不代表这个操作先行发生;一个操作先行发生也不代表这个操作在时间上是先发生的(重排序的出现)。

时间上的先后顺序对先行发生没有太大的关系,所以衡量并发安全问题的时候不要受到时间顺序的影响,一切以先行发生原则为准。

转载于:https://my.oschina.net/134596/blog/1808779

简述Java内存模型的happen before原则相关推荐

  1. 深入探索JVM高效并发 — Java内存模型(四) 先行发生原则

    先行发生原则 Java语言中有一个"先行发生"(Happens-Before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的非常有用的手段. 依赖这个原则,我们 ...

  2. java内存模型之先行发生原则

    happen-before(先行发生)原则 一.导语 二.概念 三.八个规则 1.程序次序规则 2.管程锁定规则 3.volatile变量规则 4.线程启动规则 5.线程终止规则 6.线程中断规则 7 ...

  3. 简述Java内存模型的由来、概念及语义

    JDK5引入了JMM新规范:JSR-133,引入了happens-before/可见性等概念,对synchronized/volatile/final等关键词进行了语义定义.解决了:final变量在构 ...

  4. 程序员写好技术文章的几点小技巧,简述java内存模型面试

    开头 该文档在Github上收获5K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识.Java集合.JVM.多线程并发.spring原理.微服务.Netty 与R ...

  5. 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则

    前言 楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中.在一次学习中去理解这些东西.才能更好的理解 Jav ...

  6. Java内存模型、volatile、原子性、可见性、有序性、happens-before原则

    目录 1.硬件的效率与一致性: 缓存一致性(Cache Coherence) 2.Java内存模型 2.1主内存与工作内存 2.2内存间的交互 2.3 volatile型变量的特殊规则 2.3.1 保 ...

  7. Java内存模型与happens-before原则

    Java内存模型 Java内存模型不同于Jvm内存模型,Java内存模型(JMM)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将于其他线程可见. 在Java虚拟机规范中试图定 ...

  8. java很贵可以用before代替吗_Java内存模型与Volatile,Happen-Before原则等

    Java的内存模型 Java内存模型(JMM)是一个抽象的模型.决定了线程主要定义了线程和内存间的抽象关系:主内存存放的是线程共享变量,每个线程有自己的工作内存,存放变量的副本,只能对副本进行读写,副 ...

  9. java内存模型—先行发生原则

    Java语言中有一个"先行发生"(happens-before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的主要依据,依赖这个原则,我们可以通过几条规则一揽子 ...

  10. 内卷老员工之java内存模型的happens-before原则

    java内存模型的happens-before原则 前言 happens-before原则是指线程本地内存与主内存的同步关系,只有满足happens-before原则的情况下,线程内存发生变化时,才会 ...

最新文章

  1. 【radar】毫米波雷达静态障碍物识别及其相关资料(仿真、生成、标定、运动估计、静态障碍物识别)(3)
  2. 调试H3C MSR 20-20 PPPOE拨号
  3. Android之四大组件(Activity)
  4. C/Cpp / STL / vector 的 erase 会造成当前位置和之后的迭代器失效的疑问
  5. LocalDB连接失败
  6. 逻辑漏洞——业务逻辑问题
  7. Flutter - 生成二维码与识别二维码
  8. 1.单机部署hadoop测试环境
  9. 老码农吐血建议:2020年,低于1w的程序员要注意了...
  10. spring4.x(13)---SpringEL-操作List、Map
  11. NOIp2017 题解
  12. 解决黑苹果睡眠唤醒后立马死机(AppleHDAHDMI_DPDriver)
  13. html元素标记不允许使用嵌套,第153天:关于HTML标签嵌套的问题详解
  14. 中国农业大学计算机研究生专业课,2020年中国农业大学计算机科学与技术考研经验分享...
  15. 帮你一个简单的微信怎么刷票及微信如何刷票技巧「图文教程」
  16. 如何修改win服务器默认路由,服务器win默认路由设置方法
  17. 无可比拟的视觉环绕感 电子竞技游戏显示器就该选这样的带鱼屏
  18. 【推荐】1657- 灵活可扩展,2023年值得尝试的13款富文本编辑器
  19. Python实现各种加密,接口加解密不说难
  20. QQ登录显示无法访问个人文件夹解决办法

热门文章

  1. 387. First Unique Character in a String - String
  2. 462.最少移动次数使数组元素相等II
  3. 2020 携程 面经
  4. eureka集群 ha_SpringCloud如何实现Eureka集群、HA机制-百度经验
  5. 【51nod 1439】互斥对【容斥原理】
  6. SQLyog安装成功步骤(附带码),2021版最新
  7. 《Web漏洞防护》读书笔记——第6章,XXE防护
  8. mysql kill 很多_MySQL--批量KILL连接
  9. 简单的全局异常统一处理
  10. php 设置空数组,声明空数组,填充和迭代问题-php