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

对Happens-Before的理解

Happens-Before

Happens-Before 是一种可见性模型,也就是说,在多线程环境下。原本因为指令重排序的存在会导致数据的可见性问题,也就是 A 线程修改某个共享变量对 B 线程不可见。因此,JMM 通过 Happens-Before 关系向开发人员提供跨越线程的内存可见性保证。如果一个操作的执行结果对另外一个操作可见,那么这两个操作之间必然存在Happens-Before 管理。其次,Happens-Before 关系只是描述结果的可见性,并不表示指令执行的先后顺序,也就是说只要不对结果产生影响,仍然允许指令的重排序。

Happens-Before 规则

在 JMM 中存在很多的 Happens-Before 规则:
程序顺序规则,一个线程中的每个操作,
  • happens-before 这个线程中的任意后续操作,可以简单认为是 as-if-serial也就是不管怎么重排序,单线程的程序的执行结果不能改变
  • 传递性规则(如图),也就是 A Happens-Before B,B Happens-Before C。就可以推导出 A Happens-Before C。

  • volatile 变量规则,对一个 volatile 修饰的变量的写一定 happens-before 于任意后续对这个 volatile 变量的读操作
  • 监视器锁规则(如图),一个线程对于一个锁的释放锁操作,一定 happens-before 与后续线程对这个锁的加锁操作在这个场景中,如果线程 A 获得了锁并且把 x 修改成了 12,那么后续的线程获得锁之得到的 x 的值一定是 12

  • 线程启动规则(如图),如果线程 A 执行操作 ThreadB.start(),那么线程 A 的ThreadB.start()之前的操作 happens-before 线程 B 中的任意操作。在这样一个场景中,t1 线程启动之前对于 x=10 的赋值操作,t1 线程启动以后读取 x的值一定是 10.

  • join 规则(如图),如果线程 A 执行操作 ThreadB.join()并成功返回, 那么线程 B 中的任意操作 happens-before 于线程 A 从 ThreadB.join()操作成功的返回。

http://www.lryc.cn/news/210104.html

相关文章:

  • 分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测
  • Java面试八股文之暑假合集
  • 竞赛选题 深度学习卫星遥感图像检测与识别 -opencv python 目标检测
  • 机器学习第一周
  • 大数据采集技术与预处理学习一:大数据概念、数据预处理、网络数据采集
  • MySQL - 为什么索引结构默认使用B+树,而不是其他?
  • 信息系统项目管理师教程 第四版【第3章-信息系统治理-思维导图】
  • 2023.NET技术沙龙知识学习笔记
  • Golang教程——配置环境,再探GoLand
  • C++之lambda匿名、using、typedef总结【全】(二百四十九)
  • 基于SpringBoot的个人博客系统
  • javascript中的继承
  • 智能问答技术在百度搜索中的应用
  • STM32F4X SDIO(一) SD卡介绍
  • 10分钟了解JWT令牌 (JSON Web)
  • 【经验总结】ECU系统休眠后通过诊断报文唤醒ECU且唤醒网络后快发NM报文
  • 基于Android 10系统的ROC-RK3399-PC Pro源码编译
  • 网络滤波器/网络滤波器/脉冲变压器要怎样进行测试,一般要测试哪些参数?
  • 基于vue天气数据可视化平台
  • Go 语言常见的 ORM 框架
  • 【错误解决方案】ModuleNotFoundError: No module named ‘cPickle‘
  • NodeJS14.18.0 安装,以及安装相应版本node-sass
  • cosover是什么?crossover23又是什么软件
  • AR眼镜安卓主板,智能眼镜光机方案定制
  • Qt中实现页面切换的两种方式
  • 公司电脑如何限制安装软件
  • 【C++】STL容器——list类的使用指南(含代码演示)(13)
  • Table-GPT:让大语言模型理解表格数据
  • 基于单片机的温湿度和二氧化碳检测系统设计
  • leetcode做题笔记204. 计数质数