下面是happens-before原则规则:

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

Volatile关键字,能够保证可见性,禁止进行指令重排序。

可见性:线程都有自己的线程方法栈,也就是Java虚拟机栈,当线程第一次从主存中读取某一个变量的值会复制到自己私有线程栈中,如果使用了volatile关键字,会强制线程将修改后的值写入主存,其他线程也会从主存中读取该变量值。

指令重排:Java 语言规范规定了JVM线程内部维持顺序化语义,也就是说只要程序的最终结果等同于它在严格的顺序化环境下的结果,那么指令的执行顺序就可能与代码的顺序不一致。这个过程通过叫做指令的重排序。

指令重排序存在的意义在于:JVM能够根据处理器的特性(CPU的多级缓存系统、多核处理器等)适当的重新排序机器指令,使机器指令更符合CPU的执行特点,最大限度的发挥机器的性能,提高效率。

参考:https://www.cnblogs.com/chenssy/p/6393321.html

最新文章

  1. #1094 : Lost in the City
  2. 1.linux服务器的性能分析与优化
  3. UIAlertController 使用
  4. js每天进步一点点
  5. php数组转换js数组操作及json_encode应用
  6. C# WebApi传参之Get请求-AJAX
  7. 【M29】引用计数
  8. 《Java并发编程实战》第十五章 原子变量与非堵塞同步机制 读书笔记
  9. UVA - 12627 Erratic Expansion 奇怪的气球膨胀 (分治)
  10. CoreData的数据迁移
  11. Mac系统-java环境搭建_01
  12. Rectangles hdu2461容斥定理
  13. 80端口被系统服务【kernel&System】占用解决方案
  14. CU社区shell板块awk十三问整理
  15. (摘)使用 .NET Core 实现依赖关系注入
  16. spark-sql自定义函数UDF和UDAF
  17. 打造RecyclerView的n级列表
  18. MVC Razor视图下ViewData传递html内容被转义
  19. Windows下使用Rtools编译R语言包
  20. PAT 1066 图像过滤

热门文章

  1. day2作业(基本数据类型,语法)
  2. FreeMarker生成Word文档
  3. mysql decode encode 乱码问题
  4. windows服务器自动删除日志文件
  5. 使用MagicAJax的AjaxPanel时有时会弹出"Using the AjaxCallHelper write methods outside of an AjaxCall is not allowed."
  6. oracle数据库启动流程及登录认证方式详解
  7. APP-5-百度电子围栏
  8. WDA-6-EP系统管理/内容管理/用户管理
  9. 【坑】tableView cell默认选中
  10. Delphi Qjson