当前位置: 首页 > news >正文

Happens-before原则

  • 程序次序规则(Program Order Rule):在一个线程内,按照控制流顺序(不是程序代码顺序,要考虑分支、循环等结构),书写在前面的操作先行发生于书写在后面的操作。
  • 管程锁定规则(Monitor Lock Rule):对于同一个锁,如果一个unlock操作先行发生后面(运行时间上的先后)一个lock操作,那么该unlock操作(包括unlock操作之前的操作)所产生的影响对于该lock操作(包括lock操作之后的操作)是可见的。
  • volatile变量规则(Volatile Variable Rule):对于同一个volatile变量,如果对于这个变量的操作先行发生后面(运行时间上的先后)对于这个变量的操作,那么对于这个变量的写操作(包括写操作之前的操作)所产生的影响对于这个变量的读操作(包括读操作之后的操作)是可见的。
  • 线程启动规则(Thread Start Rule):对于同一个Thread对象,该Thread对象的start()方法先行发生于此线程的每一个动作,也就是说对线程start()方法调用(包括start方法之前的操作)所产生的影响对于该线程的每一个动作都是可见的。
  • 线程终止规则(Thread Termination Rule):对于一个线程,线程中发生的所有操作先行发生于对此线程的终止检测,也就是说线程中的所有操作所产生的影响对于调用线程的Thread.join()方法或者Thread.isAlive()的返回值为false方法(包括调用这两个方法之后的操作)都是可见的。
  • 线程中断规则(Thread Interruption Rule):对于同一个线程,调用线程的interrupt()方法先行发生于任何线程检测到该线程中断事件的发生,也就是说调用线程的interrupt()方法(包括interrupt方法调用之前的操作)所产生的影响对于任何线程检测到该线程检测到中断事件(包括检测到中断事件之后的操作,例如Thread.interrupted()为true或中断线程的isInterrupted()为true)是可见的。
  • 对象终结规则(Finalizer Rule) :对于同一个对象,它的构造方法执行结束先行发生于它的finalize()方法的开始,也就是说一个对象的构造方法结束(包括构造方法结束前的操作)所产生的影响,对于它的finalize()方法开始执行(包括开始之后的操作)是可见的。
  • 传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。

具体测试实例,可参考

Happens-Before原则深入解读_YYniannian的博客-CSDN博客

FutureTask借用Happens-before原则保证了返回结果的可见性,可参考 

老爷子这代码,看跪了!_why技术的博客-CSDN博客

相关文章:

  • 【毕业设计】 基于单片机的放松按摩仪设计与实现 - 物联网 嵌入式 stm32
  • 基于springboot,vue校园点餐系统
  • qmake 文件扩展名操作
  • 【javaweb简单教程】9.Servlet与过滤器超简单教程
  • 猛淦,阿里大老纯手撸Spring高级源码手册,啃起来真TM香啊
  • ES6导入与导出(module)
  • 【opencv-c++】cv::imshow和cv::waitKey函数显示图像
  • 第二课 我的第一个程序 hello world
  • 消息队列实现分布式事务
  • 前端性能优化指标 + 检测工具
  • CubeMx笔记 --pwm输出+输入捕获
  • 轻松玩转树莓派Pico之一、新手上路
  • 目前我国网络安全人才市场状况
  • Redis源码解读之用RedisAe实现一个简单的HTTP服务器
  • 【极简python】第一章 print与变量
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • angular组件开发
  • Consul Config 使用Git做版本控制的实现
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • javascript数组去重/查找/插入/删除
  • Linux gpio口使用方法
  • log4j2输出到kafka
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mysql常用命令汇总
  • node入门
  • react 代码优化(一) ——事件处理
  • spring学习第二天
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 解决iview多表头动态更改列元素发生的错误
  • 判断客户端类型,Android,iOS,PC
  • 我有几个粽子,和一个故事
  • 项目实战-Api的解决方案
  • 小试R空间处理新库sf
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​​​​​​​​​​​​​​Γ函数
  • #{}和${}的区别?
  • #微信小程序:微信小程序常见的配置传值
  • (175)FPGA门控时钟技术
  • (SpringBoot)第二章:Spring创建和使用
  • (ZT)出版业改革:该死的死,该生的生
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)计算机毕业设计ssm电影分享网站
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (转载)深入super,看Python如何解决钻石继承难题
  • .aanva
  • .NET Core引入性能分析引导优化
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net生成的类,跨工程调用显示注释
  • .NET实现之(自动更新)
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .skip() 和 .only() 的使用