happens-before规则

news2024/12/25 0:34:21

在这里插入图片描述

happens-before背景由来

happens-before的概念最初由Leslie Lamport在其一篇影响深远的论文(《Time,Clocks and the Ordering of Events in a Distributed System》)中提出。Leslie Lamport使用 happens-before 来定义分布式系统中事件之间的 偏序关系(partial ordering) 。Leslie Lamport在这篇论文中给出了一个分布式算法,该算法可以将该偏序关系扩展为某种 全序关系
JSR-133使用 happens-before 的概念来指定两个操作之间的执行顺序。由于这两个操作可以在一个线程之内,也可以是在不同线程之间。因此,JMM可以通过 happens-before 关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happens-before关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。

happens-before规则

《JSR-133:Java Memory Model and Thread Specification》定义了如下happens-before规则
程序顺序规则一个线程中的每个操作,happens-before于该线程中的任意后续操作。
监视器锁规则对一个锁的解锁,happens-before于随后对这个锁的加锁。
volatile变量规则对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
传递性如果A happens-before B,且B happens-before C,那么A happens-before C。
start()规则如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
join()规则如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

happens-before 和 as-if-serial 对比

-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明


在这里插入图片描述

啥是happens-before原则

Java的内存模型具备一些天生的有序性规则,不需要任何同步手段就能够保证有序性,这个规则被称为Happens-before原则。
如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就无法保证有序性,也就是说虚拟机或者处理器可以随意对它们进行重排序处理。

happens-before原则

happens-before原则
程序次序规则在一个线程内,代码按照编写时的次序执行,编写在后面的操作发生于编写在前面的操作之后这句话的意思看起来是程序按照编写的顺序来执行,但是虚拟机还是可能会对程序代码的指令进行重排序,只要确保在一个线程内最终的结果和代码顺序执行的结果一致即可
锁定规则一个unlock操作要先行发生于对同一个锁的lock操作这句话的意思是,无论是在单线程还是在多线程的环境下,如果同一个锁是锁定状态,那么必须先对其执行释放操作之后才能继续进行lock操作
volatile变量规则对一个变量的写操作要早于对这个变量之后的读操作根据字面的意思来理解是,如果一个变量使用volatile关键字修饰,一个线程对它进行读操作,一个线程对它进行写操作,那么写入操作肯定要先行发生于读操作
传递规则如果操作A先于操作B,而操作B又先于操作C,则可以得出操作A肯定要先于操作C这一点说明了happens-before原则具备传递性
线程启动规则Thread对象的start()方法先行发生于对该线程的任何动作只有start之后线程才能真正运行,否则Thread也只是一个对象而已
线程中断规则对线程执行interrupt()方法肯定要优先于捕获到中断信号这句话的意思是指如果线程收到了中断信号,那么在此之前势必要有interrupt()
线程的终结规则线程中所有的操作都要先行发生于线程的终止检测通俗地讲,线程的任务执行、逻辑单元执行肯定要发生于线程死亡之前
对象的终结规则一个对象初始化的完成先行发生于finalize()方法之前这个更没什么好说的了,先有生后有死

-----------------------------------------------------------------------------书名:Java高并发编程详解:多线程与架构设计 作者:汪文君

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【利用AI让知识体系化】7种结构型模式

文章目录 结构型模式简介适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式 结构型模式 简介 在设计模式中,结构型模式用于描述如何将对象和类组装成较大的结构,并灵活地处理对象之间的关系。 结构型模式包括以下几种: 适配器…

驱动开发——嵌入式(驱动)软开基础(十)

1. 64位的计算机有哪些优点? (1)可以进行更大范围的整数计算。 (2)可以支持更大的内存,虚拟内存空间大小一般为2^48(256TB)。64位的Linux一般使用48位表示虚拟内存空间地址&#x…

esp8266 OTA远程无线升级

第一步、编译生成.bin升级固件 本教程需要用到 arduino IDE的esp8266开发环境,关于arduino IDE 的ESP8266环境配置可参考:环境配置: 点击跳转 如果已安装好esp8266 开发环境,继续: 使用arduino IDE软件,打开随便一个需要升级的程序,点击「项目」-「导出已编译的二进制…

【Bug 全解决】 Java、Spring boot 后端项目 Bug 总结

Bug 收集与总结 本文记录的是 SpringBoot 后端项目使用和运行代码时所遇到的各种问题,全部都已解决,欢迎在评论区补充你遇到的 Bug 哦!仅以本文记录学习社区项目时,所遇到的奇奇怪怪的 bug,以及一些很愚蠢的错误&…

Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

目录 223. 矩形面积 Rectangle Area 🌟🌟 226. 翻转二叉树 Invert Binary Tree 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

RPC原理与实现

rpc叫做远程过程调用,是指一台机器上的服务通过通信协议调用网络中另一台机器上的程序,并拿到结果。 1、基本流程 基本流程为: 客户端程序通过Client Stub调度rpc函数Client Stub将调用方法、参数按照通信协议序列化成网络二进制数据&#…

koa2中HTTP错误处理

HTTP错误 访问 Web 服务器或应用程序时,服务器收到的每个 HTTP 请求都会以 HTTP 状态代码进行响应。 HTTP 状态代码是三位数代码,分为五个不同的类别。 状态代码的类别可以通过它的第一个数字快速识别: 1xx:信息2xx&#xff1a…

“大娘,你听说过ChatGPT吗?”,“你说的那个什么鸡皮蹄,我这饼里加不了!”

最近看到一个有意思的段子,大概意思是: 年轻人去买煎饼,问摊煎饼的大娘知不知道什么是ChatGPT。 大娘摇了摇头:“你说的那个什么鸡皮蹄,我这饼里加不了”。 年轻人尝试跟大娘解释ChatGPT是什么东西,大娘…

快速上手kettle(二)小试牛刀

快速上手kettle二 小试牛刀 一 、前言二 、两个小目标三、 kettle核心概念介绍3.1 转换3.1.1 步骤(Step)3.1.2 跳(Hop)3.1.3 元素据3.1.4 数据类型3.1.5 并发执行 3.2 作业 四、实践操作4.1 案例1 将csv文件转换成excel文件4.1.1 在kettle中新建一个转换…

在Node.js中接受来自命令行的输入

目录 1、简介 2、readlineSync 3、列表选择一个项目: 4、类似滑块范围的UI: 1、简介 如何制作一个Node.js CLI程序使用内置的readline Node.js模块进行交互 如何制作一个节点js CLI程序交互? Node.js 从版本7起开始提供了readline模块来执行以下操…

styleFlow数学推导

如果 w 和 z 的变换是线性的,即 w az b,那么 dw a dz, 所以 p(w) dw p(z) dz 等价于 p(w) a p(z) 即 w 的概率密度函数是 z 的概率密度函数乘以一个常数因子。 如果 w 和 z 是通过一个可逆的函数 ϕ 相互转换的,即 w ϕ(…

5.29今日黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势?今日黄金多空该如何研判? ​黄金消息面解析:上周五(5月26日)美市尾盘,现货黄金收报1946.01美元/盎司,上升4.76美元或0.25%,日内最高触及1957.31美元/盎司,最低触…

1.3 eBPF的工作原理初探 --- 更新中

写在前面 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。 我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。 如上是…

Java学习路线(16)——异常

一、异常 1、概念: 程序在“编译”或“执行”时可能出现的问题。(语法错误不算异常) 2、常见的异常 数组索引越界空指针日期格式化… 3、作用: 触发异常后,如果没有提前处理,JVM将终止,提高…

chatgpt赋能python:Python中None的使用详解

Python中None的使用详解 在Python语言中,None是一个非常常见的值,它在代码中用来表示空值或未定义的值。本文将介绍Python中None的使用方式,包括创建和比较None对象,以及在函数和类中使用None的方法。 创建和比较None对象 在Py…

chatgpt赋能python:Python中Key的作用及使用方法

Python中Key的作用及使用方法 在Python中,key是一个十分重要的概念。它在数据结构中经常被使用,例如list、dict、set、tuple等等。本文将重点介绍Python中key的作用和使用方法,帮助读者更好地理解和应用它。 什么是Key 首先,我…

返回数组中非零元素的索引np.flatnonzero()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回数组中非零元素的索引 np.flatnonzero() 选择题 以下程序的运行结果是? import numpy as np anp.array([0,1,2,3]) print("【显示】a:");print(a) print("【执行】print(n…

JLabel默认是透明的,所以JLabel设置背景色setBackground之前要setOpaque(true);

JLabel默认是透明的,所以JLabel设置背景色setBackground之前要setOpaque(true); 将不透明设为true,再setBackground jlabel.setOpaque(true); jlabel.setBackground(new Color(0, 0, 0, 100)); //将不透明设为true,再setBackgroundjlabel.setOpaque(true); jlabel.setBackgro…

chatgpt赋能python:Python中n次方的介绍

Python中n次方的介绍 Python中的n次方是指将一个数值或变量的值提高到某个指定的指数值。这在数据科学、计算机科学和科学计算等领域中非常常见。 在Python中,我们可以使用内置函数**或pow函数来实现n次方。 通过**进行n次方运算 使用**运算符时,将要…

哨兵3号(Sentinel 3)卫星数据处理

李国春 本文介绍使用RSD处理欧空局哨兵3号(Sentinel 3)卫星数据的具体方法。 气象数据多用NetCDF格式交换和存储,气象卫星数据也是如此。气象业内认为HDF5也是NetCDF的一部分,虽然文件扩展名使用的是.nc,但是实际上就…