在java内存模型中,happens-before应该理解为:前一个操作的结果,可以被后续的操作获取,即内存可见性。
  为了解决多线程的内存可见性问题,就提出了happens-before原则,让线程之间遵守这些原则,同时对编译器的优化也进行了一定的约束。
  以下是原则内容:

1、程序次序规则

  在一个线程内,一段代码的执行结果是有序的。依然会有指令重排,但是不论怎么重排序,结果都是按照代码顺序生成的不会变。

2、管程锁定规则

  无论在单线程环境还是多线程环境,对于同一个锁来说,一个线程对这个锁解锁之后,另一个线程获取了这个锁,则它能看到前一个线程的操作结果。

3、volatile变量规则

  如果一个线程先去写一个volatile变量,然后一个线程去读这个变量,那么这个写操作的结果一定对读的这个线程可见。

4、线程启动规则

  在主线程A执行过程中,启动子线程B,那么线程A在启动子线程B之前对共享变量的修改结果对线程B可见。

5、线程终止规则

  在主线程A执行过程中,子线程B终止,那么线程B在终止之前对共享变量的修改结果在线程A中可见。

6、线程中断规则

  对线程interrupt()方法的调用先行发生于被中断线程代码检测到中断事件的发生,可以通过Thread.interrupted()检测到是否发生中断。

7、传递性规则

  就是happens-before原则具有传递性,即A happens-before B , B happens-before C,那么A happens-before C

8、对象终结规则

  就是一个对象的初始化的完成,也就是构造函数执行的结束一定 happens-before它的finalize()方法

最新文章

  1. 各种Android手机Root方法
  2. DSO的记录模式Record Mode字段测试
  3. Intent组件的传参应用
  4. 【背景建模】SOBS
  5. https和http共存的nginx配置
  6. Android开源项目SlidingMenu深切解析
  7. 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)
  8. Selenium+Python浏览器调用:Firefox
  9. [笔记]scanf的使用(主要是针对char)
  10. [git]checkout&branch
  11. 关于git的认证方式
  12. vue中父子组件的通信
  13. day 69 orm操作之表关系,多对多,多对一(wusir总结官网的API)
  14. tomcat顺序图摘要
  15. nginx入门一
  16. SecureCRT中常用linux命令 -《转载》
  17. 搭建基于MyEclipse的Hadoop开发环境
  18. linux下jdk_tomcat+mysql配置那点事
  19. vue provide和inject使用
  20. linux配置了dns后导致mysql远程连接慢问题

热门文章

  1. KiCad Mark 点名称
  2. qt 在ui界面添加控件后在cpp文件中无法调用?
  3. 解决 vs 出现Error MC3000 给定编码中的字符无效
  4. Angular项目目录结构
  5. SuperSocket性能数据采集的应用程序接口的改动
  6. [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]
  7. Element-ui学习笔记3--Form表单(一)
  8. jq杂项方法/工具方法----trim() html() val() text() attr()
  9. Python--day66--Django模板语言关于静态文件路径的灵活写法
  10. Centos 6.5 配置hadoop2.7.1