Java内存模型(JMM)-happens-before

Java内存模型(JMM)-happens-before    

    Java内存模型(JMM)是一种规范,用于定义多线程程序中,线程如何与主内存、工作内存以及其他线程之间进行通信和交互。

     其中,happens-before是JMM中的一个重要概念,指的是一个操作的执行结果对后续操作可见。具体来说,如果操作A happens-before操作B,则操作A的结果对于操作B来说是可见的,即操作B可以看到操作A的执行结果。

happens-before关系的几种情况:

  • 程序顺序规则:同一个线程中,前一条语句的执行结果对后一条语句可见。
  • volatile变量规则:对一个volatile变量的写操作 happens-before 于后续对该变量的读操作。
  • 传递性:如果操作A happens-before操作B,操作B happens-before操作C,那么操作A happens-before操作C。
  • 管程锁规则:一个unlock操作 happens-before后续对同一个monitor的lock操作。
  • 线程的启动规则:Thread对象的start()方法调用 happens-before于该线程的任何操作。
  • 线程的终止规则:线程的所有操作都 happens-before于其他线程检测到这个线程已经终止。
  • 中断规则:对线程 interrupt()方法的调用 happens-before于被中断线程的代码检测到中断事件的发生。

      通过happens-before关系的规定,Java内存模型确保了多线程程序的一致性和可预测性,使得程序员能够在多线程环境中正确地进行操作。

Java内存模型(JMM)-happens-before作用:

  1. 程序顺序规则:在一个线程中,按照代码书写的顺序,前面的操作happens-before后面的操作。这保证了在一个线程中的操作是按照顺序执行的。

  2. volatile变量规则:对一个volatile变量的写操作happens-before后续对该变量的读操作。这确保了volatile变量的写操作对其他线程可见。

  3. 锁规则:解锁操作happens-before后续对同一锁的加锁操作。这保证了线程释放锁之前的所有操作对于后续线程获得锁后的操作是可见的。

  4. 传递性:如果操作A happens-before操作B,操作B happens-before操作C,那么操作A happens-before操作C。这允许了happens-before关系的传递性。

     "happens-before"关系的作用是保证了多线程程序的可见性和有序性。它提供了一种可靠的方式来避免数据竞争和不确定性行为。在编写多线程程序时,了解和正确使用"happens-before"关系是非常重要的。

Java内存模型(JMM)-happens-before理论

      Java内存模型(JMM)是一种规范,用于定义线程如何与主内存和其他线程之间进行通信的方式。它确保多线程程序的一致性和可预测性。

      在JMM中,happens-before关系是一个重要的概念。它定义了一组规则,用于确定在多线程程序中,一个操作的结果是否对另一个操作可见。

happens-before关系有以下几个规则:

  1. 程序顺序规则(Program Order Rule):在同一个线程中,按照程序的顺序,前面的操作happens-before于后面的操作。

  2. 管程锁规则(Monitor Lock Rule):一个解锁操作happens-before于后续对同一个锁的加锁操作。

  3. volatile变量规则(Volatile Variable Rule):一个volatile变量的写操作happens-before于后续对该变量的读操作。

  4. 线程启动规则(Thread Start Rule):调用Thread对象的start()方法happens-before于启动的线程执行run()方法。

  5. 线程终止规则(Thread Termination Rule):一个线程在其他线程调用它的join()方法成功返回或者线程的isAlive()方法返回false之后,该线程的所有操作都happens-before于这个线程的终止。

  6. 线程中断规则(Thread Interruption Rule):对线程调用interrupt()方法happens-before于被中断线程检测到中断事件的发生。

  7. 对象终结规则(Finalizer Rule):一个对象的构造函数完成先于finalize()方法的开始。

  8. 传递性规则(Transitivity):如果操作A happens-before操作B,操作B happens-before操作C,则操作A happens-before操作C。

Java内存模型(JMM)-happens-before实例

public class HappensBeforeExample {private static int x = 0;private static int y = 0;private static boolean flag = false;public static void main(String[] args) throws InterruptedException {Thread writer = new Thread(() -> {x = 1; // 1flag = true; // 2});Thread reader = new Thread(() -> {if (flag) { // 3y = x; // 4}});writer.start();reader.start();writer.join();reader.join();System.out.println("x = " + x + ", y = " + y);}
}

解释:

  1. 写操作x = 1 happens-before 写操作flag = true。这是因为这两个操作属于同一个线程,按照程序的顺序执行,而且后一个操作依赖于前一个操作的结果。因此,第一个操作的结果对于第二个操作是可见的。
  2. 写操作flag = true happens-before 读操作if (flag)。这是因为这两个操作分别在不同的线程中执行,而写操作的结果在内存中可见之后,读操作才能读取到正确的结果。通过happens-before规则,写操作的结果对于读操作是可见的。
  3. 读操作if (flag) happens-before 写操作y = x。这是因为这两个操作分别在不同的线程中执行,而读操作必须在写操作之后进行,以确保读取到正确的结果。因此,通过happens-before规则,读操作在写操作之后发生。

     根据这些happens-before关系,可以推导出最终的输出结果。在这个示例中,正确的结果应该是x = 1, y = 1。这是因为写操作x = 1flag = true之间存在happens-before关系,写操作flag = true和读操作if (flag)之间存在happens-before关系,读操作if (flag)和写操作y = x之间存在happens-before关系。

总结

  1. 程序顺序规则(Program Order Rule):在单个线程中,按照程序的顺序执行的操作,前面的操作happens-before于后面的操作。

  2. volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作,happens-before对该变量的后续读操作。换句话说,对volatile变量的写操作具有可见性。

  3. 传递性(Transitivity):如果操作A happens-before操作B,操作B happens-before操作C,则操作A happens-before操作C。

  4. 管程中锁的规则(Lock Rule):一个unlock操作happens-before后续对同一个锁的lock操作。

  5. 线程的start()规则(Thread Start Rule):对于线程A来说,如果线程A的start()方法先于线程B的任意操作执行,那么线程A中的所有操作happens-before线程B中的任意操作。

  6. 线程的join()规则(Thread Join Rule):线程A执行了线程B的join()操作,那么线程B中的任意操作happens-before线程A的后续操作。

  7. 线程的中断规则(Thread Interruption Rule):对线程A进行interrupt()调用,会使得对线程A的后续操作happens-before对于调用interrupt()方法的线程的任意操作。

  8. 对象finalize规则(Finalizer Rule):一个对象的finalize()方法的执行,happens-before 对象的后续任意操作。

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

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

相关文章

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要,给公司写过一整套直播的库( 推拉流,编解码),类似于 libobs。 结果后来因为没有相关项目,便停止开发&维护了。 不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。…

Java 处理Mysql获取树形的数据

Mysql数据&#xff1a; 代码如下&#xff1a; Entity&#xff1a; Data Accessors(chain true) public class Region {private BigInteger id;//名称private String name;//父idprivate BigInteger parentId;private List<Region> children;private Integer createTim…

clickhouse MPPDB数据库--新特性使用示例

clickhouse 新特性&#xff1a; 从clickhouse 22.3至最新的版本24.3.2.23&#xff0c;clickhouse在快速发展中&#xff0c;每个版本都增加了一些新的特性&#xff0c;在数据写入、查询方面都有性能加速。 本文根据clickhouse blog中的clickhouse release blog中&#xff0c;学…

K8S Deployment 简介, 1个简单的Kubernetes Deployment YAML 文件

当谈到 Kubernetes 集群中的应用程序部署和管理时&#xff0c;Deployment、ReplicaSet 和 Pod 是三个重要的概念。它们之间存在一定的关系和层次结构。下面是对 Deployment、ReplicaSet 和 Pod 的详细解释以及它们之间的关系。 Deployment&#xff08;部署&#xff09; Deploy…

js教程(12)——本地储存

一、介绍 前端本地存储是指在浏览器中存储数据的机制&#xff0c;它允许前端开发者将数据保存在用户的浏览器中&#xff0c;以便在用户下次访问网站时可以使用这些数据。 前端本地存储有以下几种方式&#xff1a; Cookie&#xff1a;Cookie 是最早也是最常用的前端本地存储方式…

【Java设计模式】序:设计模式总体概述

目录 什么是设计模式设计模式的分类1 创建型模式1.1. 单例&#xff08;Singleton&#xff09;1.2 原型&#xff08;Prototype&#xff09;1.3 工厂方法&#xff08;FactoryMethod&#xff09;1.4 抽象工厂&#xff08;AbstractFactory&#xff09;1.5 建造者&#xff08;Builde…

31. 下一个排列 —— LeetCode (python) [PS: LeetCode 运行环境疑似出错]

# encoding utf-8 # 开发者&#xff1a;xxx # 开发时间&#xff1a; 20:26 # "Stay hungry&#xff0c;stay foolish."class Solution(object):def nextPermutation(self, nums):import itertoolsl len(nums)a tuple(nums)nums.sort()permutations_lst list(ite…

Android RecycleView 异步缓存 itemView 提升滑动性能

RecyclerView 是 Android 官方推荐的用于展示大量数据列表的控件&#xff0c;具有高度的可定制性和灵活性。我们可以通过自定义 LayoutManager、ItemDecoration、ItemAnimator 等来实现不同的布局和动画效果&#xff0c;满足各种需求。同时&#xff0c;RecyclerView 支持局部刷…

C语言什么是静态变量?如何实现?

一、问题 在编写程序的过程中&#xff0c;对于某些函数的局部变量的值&#xff0c;有时不希望它在函数调⽤结束后消失&#xff0c;也就是不释放该变量所占⽤的存储单元&#xff1b;同样&#xff0c;有时在程序设计中也希望某些外部变量只限于被本⽂件引⽤。这就需要使⽤静态变量…

2024年清明节安装matlab 2024a

下载安装离线支持包SupportSoftwareDownloader_R2024a_win64&#xff0c;地址https://ww2.mathworks.cn/support/install/support-software-downloader.html&#xff0c;运行软件&#xff08;自解压运行&#xff09;&#xff0c;登录账号&#xff08;需要提前在官网注册&#x…

反转链表 - LeetCode 热题 23

大家好&#xff01;我是曾续缘&#x1f497; 今天是《LeetCode 热题 100》系列 发车第 23 天 链表第 2 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#…

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测 目录 时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于CFBP级联前向BP神经网络时序预测&#xff08;完整源码和数据)&#xff1b; 2.数据集为excel…

iHRM人力资源管理系统

iHRM人力资源管理系统 源码和教程都在此 https://www.yuque.com/aslwr/college/bxcq9npncyspgz9t ‍

开源模型应用落地-chatglm3-6b模型小试-入门篇(三)

一、前言 刚开始接触AI时&#xff0c;您可能会感到困惑&#xff0c;因为面对众多开源模型的选择&#xff0c;不知道应该选择哪个模型&#xff0c;也不知道如何调用最基本的模型。但是不用担心&#xff0c;我将陪伴您一起逐步入门&#xff0c;解决这些问题。 在信息时代&#xf…

5.111 BCC工具之ext4dist.py解读

一,工具简介 ext4dist跟踪ext4的读取、写入、打开和fsync操作,并将其延迟总结为2的幂次方直方图。 二,代码示例 #!/usr/bin/env pythonfrom __future__ import print_function from bcc import BPF from time import sleep, strftime import argparse# symbols kallsyms …

路由Vue-Router使用

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。 介绍 | Vue Router (vuejs.org) 1. 安装 npm install vue-router4 查看安装好的vue-router 2. 添加路由 新建views文件夹用来存放所有的页面&#xff0c;在…

7-42 清点代码库

上图转自新浪微博&#xff1a;“阿里代码库有几亿行代码&#xff0c;但其中有很多功能重复的代码&#xff0c;比如单单快排就被重写了几百遍。请设计一个程序&#xff0c;能够将代码库中所有功能重复的代码找出。各位大佬有啥想法&#xff0c;我当时就懵了&#xff0c;然后就挂…

笔记: javaSE day17天笔记

第十七天课堂笔记 Java常用类 数学类★★★ math java.lang.Math , 数学类 round(x) : 四舍五入 , 把 x加0.5 后向下取整 ceil(x) : 返回大于等于x的最小整数 , 向上取整 floor(x) : 返回小于等于x的最大整数 , 向下取整 sqrt(x) : 平方根 cbrt(x): 立方根 pow(a , b)…

LangChain Demo | Agent X ReAct X wikipedia 询问《三体》的主要内容

背景 LangChain学习中&#xff0c;尝试改了一下哈里森和吴恩达课程当中的问题&#xff0c;看看gpt-3.5-turbo在集成了ReAct和wikipedia后&#xff0c;如何回答《三体》的主要内容是什么这个问题&#xff0c;当然&#xff0c;主要是为了回答这问题时LangChain内部发生了什么。所…

基于大型语言模型的智能体(Agent)研究综述--人大

内容概述 论文地址&#xff1a;https://arxiv.org/pdf/2308.11432.pdf 这篇综述内容有35页&#xff0c;内容很多&#xff0c;俗话说一图胜千言&#xff0c;作者提供了5张精美的图片和3个表格&#xff0c;把这些搞明白后对这篇综述也就理解差不多了。文章的总体结构如下由6部分…