Java-重排序,happens-before 和 as-if-serial 语义

news2024/9/22 23:21:31

目录

  • 1. 如何解决重排序带来的问题
  • 2. happens-before

1. 如何解决重排序带来的问题

对于编译器,JMM 的编译器重排序规则会禁止特定类型的编译器重排序。对于处理器重排序,JMM 的处理器重排序规则会要求编译器在生成指令序列时,插入特定类型的内存屏障(Memory Barries / Memory Fence)指令,通过内存屏障指令来禁止特定类型的处理器重排序。

由于常见的处理器内存模型比 JMM 要弱,Java 编译器在生成字节码时,会在执行指令序列的适当位置插入内存屏障来限制处理器的重排序。同时,由于各种处理器内存模型的强弱不同,为了在不同的处理器平台向程序员展示一个一致的内存模型,JMM 在不同的处理器中需要插入的内存屏障的数量和种类也不同。

CPU内存屏障

  1. LoadLoad:禁止读和读的重排序;
  2. StoreStore:禁止写和写的重排序;
  3. LoadStore:禁止读和写的重排序;
  4. StoreLoad:禁止写和读的重排序。

Java内存屏障

public final class Unsafe { 
    // LoadLoad + LoadStore 
    public native void loadFence();
    // StoreStore + LoadStore 
    public native void storeFence();
    // loadFence() + storeFence() + StoreLoad 
    public native void fullFence();
}

在这里插入图片描述
在这里插入图片描述

2. happens-before

JMM 使用 happens-before 规则来阐述操作之间的内存可见性,以及什么时候不能重排序。

在 JMM 中, 如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在 happens-before 关系。换个角度来说,如果A happens-before B,则意味着A的执行结果必须对B可见,也就是保证跨线程的内存可见性。

其中,4条规则与程序员密切相关。

  1. 程序顺序规则:一个线程中的每个操作,happens-before 于该线程中的任意后续操作;
  2. volatile 变量规则:对一个 volatile 域的写,happens-before 于任意后续对这个 volatile 域的读;
  3. synchronized 规则:对一个锁的解锁,happens-before 于随后对这个锁的加锁;
  4. 传递性:若 A happens-before B,且 B happens-before C,则 A happens-before C;
  5. start() 规则:若线程 A 执行 ThreadB.start(),则线程 A 的这个操作 happens-before 于线程 B 中的任意操作;
  6. join() 规则:若线程 A 执行 ThreadB.join() 并成功返回,那么线程 B 中的任意操作 happens-before 于线程 A 从 ThreadB.join() 的成功返回。

举个栗子

假设线程 A 执行 writer() 方法之后,线程 B 执行 reader() 方法。根据 happens-before 规则,这个过程建立的 happens-before 关系可以分为 3 类:

  1. 根据顺序规则,1 happens-before 2,3 happens-before 4;
  2. 根据 volatile 规则,2 happens-before 3;
  3. 根据 happens-before 的传递性规则,1 happens-before 4。
public class Test2 {
    
    int a = 0;
    volatile boolean flag = false;

    public void writer() {
        // 1
        a = 1;
        // 2
        flag = true;
    }

    public void reader() {
        // 3
        if (flag) {
            // 4
            int i = a;
        }
    }
}

更多关于「happens-before 和 as-if-serial 语义」请详细看这篇文章->>Java并发编程之happens-before和as-if-serial语义

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

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

相关文章

Android笔记(二十五):两种sdk热更插件资源加载方案

背景 在研究sdk插件化热更新方式的过程中总结出了两套插件资源加载方案,在此记录下 资源热更方式 方式一:合并所有插件资源 需要解决资源id冲突问题 资源ID值一共4个字段,由三部分组成:PackageIdTypeIdEntryId PackageId&…

Mysql 事务的隔离性(隔离级别)

Mysql 中的事务分为手动提交和自动提交,默认是自动提交,所以我们在Mysql每输入一条语句,其实就会被封装成一个事务提交给Mysql服务端。 手动提交需要先输入begin,表示要开始处理事务,然后就是常见的sql语句操作了&…

C++之入门之命名空间、缺省参数、函数重载

一、前言 我们知道c是对c语言的完善以及再发展,所以C中的很多东西是与C语言十分修饰的,并且C也是兼容C的,学习了C之后,相信学C也不在困难,对我们来说,唯一感到不解和陌生就只有 using namespace std; 这条…

【c++】STL1—STL初识

文章目录STL的基本概念STL六大组件STL中容器、算法、迭代器容器算法迭代器容器算法迭代器初识vector存放内置数据类型vector存放自定义数据类型容器嵌套容器c的面向对象和泛型编程思想,目的就是复用性的提升。 为了建立数据结构和算法的一套标准,诞生了S…

并查集(13张图解)--擒贼先擒王

目录 前言 故事 🌼思路 🌼总结 🌼代码 👊观察过程代码 👊正确代码 👊细节代码 来自《啊哈算法》 前言 刚学了树在优先队列中的应用--堆的实现 那么树还有哪些神奇的用法呢?我们从一…

前端卷算法系列(二)

前端卷算法系列(二) 回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样…

zookeeper集群的搭建,菜鸟升级大神必看

一、下载安装zookeeperhttp://archive.apache.org/dist/zookeeper/下载最新版本2.8.1http://archive.apache.org/dist/zookeeper/zookeeper-3.8.1/二、上传安装包到服务器上并且解压,重命名tar -zxvf apache-zookeeper-3.8.1-bin.tar.gzmv apache-zookeeper-3.8.1-b…

设计环形队列

文章目录1.思路分析1.1队列空满分析1.2出队分析2.循环队列设计1.思路分析 1.1队列空满分析 首先我们假设一个长度为4的环形队列 队头front 队尾rear 当队列为空时 frontrear 当队列满时 frontrear 所以我们无法判断队列是满的或者空的 因此我们多加入一个空间使队列长度为5&am…

什么是自适应平台服务?

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 什么是自适应平台服务?1.1 自适应平台服务包含哪些功能簇呢?1.1.1 ara::sm 状态管理 (SM)1.1.2 ara::diag 诊断管理 (DM)1.1.3 ara::s2s 信号到服务映射1.1.4 ara::nm 网络管理 (NM)1.1.5 ara::ucm 更新和配置管…

数据结构期末复习总结(前章)

作者的话 作为一名计算机类的学生,我深知数据结构的重要性。在期末复习前,我希望通过这篇博客给大家一些复习建议。希望能帮助大家夯实数据结构的基础知识,并能够更好地掌握数据结构和算法的应用。 一、绪论 数据:信息的载体&am…

【测试】loadrunner安装

努力经营当下,直至未来明朗! 文章目录备注一、下载安装包二、安装loadrunner三、修改浏览器配置今天搬砖不努力,明天地位不稳定! 备注 电脑最好有IE浏览器,但是没有也没事儿。(注意:IE浏览器不…

Bootstrap系列之栅格系统

Bootstrap栅格系统 bootatrap提供了一套响应式,移动设备优先的流式网格系统,随着屏幕或者视口尺寸的增加,系统会自动分为最多12列,多出12列的将不再此行显示(换行显示) bootstrap网格系统有以下六个类 重点…

华为OD机试用Python实现 -【云短信平台优惠活动】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲云短信平台优惠活动题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明Python 代码实现代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看…

【Java基础】操作系统原理

一、进程 进程是指一段程序的执行过程,会消耗系统资源如CPU、内存、网络等。 一个进程包含静态代码段,数据,寄存器地址等 进程的特点 动态性(可动态地创建、结束进程) 并发性(进程被独立调度并占用处理…

服务器部署—若依【vue】如何部署到nginx里面?nginx刷新页面404怎么办?【完美解决建议收藏】

服务器部署项目我们大家都会遇到,但是有些铁子会遇到很多的问题,比如前端部署nginx如何操作? 前端有单纯的静态页面、还有前后端分离的项目;这里博主直接分享最牛最到位的前后端分离项目的前端部署到nginx上面,以若依项…

C语言之习题练习集

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 文章目录牛客网题号: JZ17 打印从1到最大的n位数牛客网题号&#x…

Laravel框架03:DB类操作数据库

Laravel框架03:DB类操作数据库一、概述二、数据表的创建与配置三、增删改操作1. 增加信息2. 修改数据3. 删除数据四、查询操作1. 取出基本数据2. 取出单行数据3. 获取一个字段的值4. 获取多个字段的值5. 排序6. 分页五、执行任意的SQL语句一、概述 按照MVC的架构&a…

详讲函数知识

目录 1. 函数是什么? 2. C语言中函数的分类: 2.1 库函数: 2.2 自定义函数 函数的基本组成: 3. 函数的参数 3.1 实际参数(实参): 3.2 形式参数(形参): …

我那点浅薄的MOS模拟集成电路基础

记录研究生课程模拟集成电路设计所学到的一些知识,这门课是由刘老师和周老师一起上的,刘老师讲模拟集成部分这个模集跟模电还是有很大的区别的,模拟集成主要是针对MOS器件的集成,学得更专业也更深;而周老师讲的是信号检…

华为OD机试题,用 Java 解【图片整理】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…