线程安全(五)volatile 修饰共享变量(JIT即时编译器、指令重排序)

news2024/9/22 5:41:33

目录

    • 一、volatile 简介
      • 1.1 定义
      • 1.2 volatile 的两个特性
    • 二、特性1:保证线程间的可见性
      • 示例1:普通场景
        • 1)代码示例:
        • 2)执行结果:
        • 3)总结:
      • 示例2:被 JIT 即时编译器优化
        • 1)代码示例:
        • 2)执行结果:
        • 3)原因分析:
        • 4)什么是 JIT 即时编译器?
        • 4)解决方案一:
        • 5)解决方案二:
    • 三、特性2:禁止指令重排序
      • 3.1 场景举例
      • 3.2 使用 jcstress 复现指令重排序
      • 3.3 volatile 修复指令重排序问题
      • 3.4 volatile 防止指令重排的机制
      • 3.5 volatile 使用技巧
    • 四、补充:什么是指令重排序?
      • 4.1 指令重排序的好处:提升处理速度
      • 4.2 重排序的 3 种情况
        • 1)编译器优化
        • 2)CPU 重排序
        • 3)内存的 “重排序”(不是真正的重排序)

一、volatile 简介

1.1 定义

  • volatile 关键字可以用于修饰我们之前说的共享变量(主内存中存储的对象、成员变量、数组等)。

一旦共享变量被 volatile 修饰后,就具备了两层含义:

  1. 保证线程间的可见性。
  2. 禁止指令重排序。

1.2 volatile 的两个特性

特性1:保证线程间的可见性

  • 用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程修改共享变量的同时对另一个线程可见。

特性2:禁止指令重排序

  • 用 volatile 修饰的共享变量,会在读/写共享变量时,加入不同的屏障,阻止其它读写操作越过屏障,从而达到阻止指令重排序的效果。

二、特性1:保证线程间的可见性

  • 用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程修改共享变量的同时对另一个线程可见。

示例1:普通场景

1)代码示例:

例如下面这段代码:

private static boolean stop = false;

public static void main(String[] args) {
   
    // 线程1
    new Thread(() -> {
   
        try {
   
            Thread.sleep(100);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
        stop = true;
        System.out.println(Thread.currentThread().getName() + ": modify stop to true...");
    }, "t1").start();
    // 线程2
    new Thread(() -> {
   
        try {
   
            System.out.println(Thread.currentThread().getName() + ": " + stop);
            Thread.sleep(200);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName

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

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

相关文章

如何用STM32实现modbus-RTU?

Modbus RTU是一种广泛应用于工业自动化领域的通信协议,基于主从架构,通过串行通信进行数据传输。本文将详细介绍Modbus RTU协议的基本原理,并提供在STM32微控制器上实现Modbus RTU通信的完整代码示例。 1. Modbus RTU协议概述 Modbus RTU的定义和特点 Modbus RTU(Remote Te…

【数学建模与优化】:解析与实践

目录 数学建模概述 1. 什么是数学模型 2. 数学模型的分类 2.1 按应用领域分类 2.2 按建模方法分类 2.3 按是否考虑随机因素分类 2.4 按变量的连续性分类 2.5 按对对象内部规律了解程度分类 2.6 按变量的基本关系分类 2.7 按是否考虑时间变化分类 3. 数学规划及优化模…

无人机之机架类型篇

碳纤维机架 具有低密度、高强度和高刚度的特点,非常适合商业或工业级无人机的设计。碳纤维机架在飞行过程中具有良好的减振效果,使飞行更加稳定,但制作工艺复杂,成本较高。 工程塑料机架 以其轻便、耐冲击和易加工等特点受到一…

【轻松拿捏】HashMap-详解及底层实现原理?

目录 1. 基本结构 2. 哈希函数 3. 哈希冲突解决 4. 插入操作(put) 5. 查找操作(get) 6. 删除操作(remove) 7. 扩容(resize) 8.说一下 HashMap 的实现原理?&#…

前端:Vue学习-1

前端:Vue学习-1 1. 指令1. 指令修饰符2. v-bind对样式控制的增强3. v-model应用于其他表单元素 2. 计算属性3. watch侦听器(监视器) 1. 指令 就是带有v-前缀的特殊属性,不同属性对应不同的功能 v-html:动态设置页面的html标签内容…

平替ChatGPT的多模态智能体来了

在人工智能领域,多模态技术的融合与应用已成为推动技术革新的关键。今天,我们用智匠AI实现了完全由国产模型驱动的多模态智能体——智酱v0.1.0,它不仅能够媲美ChatGPT的多模态能力,更在联网搜索、图片识别、画图及图表生成等方面展…

罗技K380无线键盘及鼠标:智慧互联,一触即通

目录 1. 背景2. K380无线键盘连接电脑2.1 键盘准备工作2.2 电脑配置键盘的连接 3. 无线鼠标的连接3.1 鼠标准备工作3.2 电脑配置鼠标的连接 1. 背景 有一阵子经常使用 ipad,但是对于我这个习惯于键盘打字的人来说,慢慢在 ipad 上打字,实在是…

WEB-INF 泄露-RoarCTF-2019-EasyJava(BUUCTF)

题目页面 点开help 这里存在文件下载漏洞,参数选择POST传参(使用HackBar插件) 查看文件内容 下载存有web信息的XML文件,这里补充一点知识点 WEB-INF主要包含一下文件或目录: /WEB-INF/web.xml:Web应用程序…

Qt会议室项目

在Qt中编写会议室应用程序通常涉及到用户界面设计、网络通信、音频/视频处理等方面。以下是创建一个基本会议室应用程序的步骤概述: 项目设置: 使用Qt Creator创建一个新的Qt Widgets Application或Qt Quick Application项目。 用户界面设计&#xff1…

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只,内容变化已多单一的fragment,变成连续的,特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动,到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…

vue学习day09-自定义指令、插槽

29、自定义指令 (1)概念:自己定义的指令,可以封装一些dom操作,扩展额外的功能。 (2)分类: 1)全局注册 2)局部注册 3)示例: 让表…

CV07_深度学习模块之间的缝合教学(2)--维度转换

教学(1):链接 1.1 预备知识 问题:假如说我们使用的模型张量是三维的,但是我们要缝合的模块是四维的,应该怎么办? 方法:pytorch中常用的函数:(1)view函数(2…

C++基础(三)

1.再探构造函数 之前的构造函数,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔开的数据成员列表,每个“成…

系统架构师考点--软件工程(上)

大家好。今天我来总结一下软件工程的相关考点。这部分是考试的重点。在上午场客观题、下午场案例题以及下午场论文都有可能考到,在上午场客观题中大约占12-15分左右。 一、软件工程概述 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过…

3d导入模型后墙体变成黑色?---模大狮模型网

在展览3D模型设计领域,技术和设计的融合通常是创意和实现之间的桥梁。然而,有时设计师们会遇到一些技术上的挑战,如导入3D模型后,墙体却突然变成了黑色。这种问题不仅影响了设计的视觉效果,也反映了技术应用中的一些复…

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时,从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后,next[1]都无脑写…

数据库学习作业

使用mysgldump命令备份数据库中的所有表 备份booksDB数据库中的books表 使用mysgldump备份booksDB和test数据库(test数据库自行准备) 使用mysq1命令还原第二题导出的book表 进入数据库使用source命令还原第二题导出的book表 创库,建表 建表的结果 插入数据 使用mysg…

医院同步时钟,构建医院零误差时间环境

在医院这个分秒必争、责任重大的场所,时间的准确性和一致性至关重要。医院同步时钟的应用,为构建医院零误差时间环境提供了坚实的保障。 一、医院同步时钟应用原因 首先,医疗工作的精确性和协同性依赖于统一且准确的时间。从手术的安排到药物…

MySQL篇:事务

1.四大特性 首先,事务的四大特性:ACID(原子性,一致性,隔离性,持久性) 在InnoDB引擎中,是怎么来保证这四个特性的呢? 持久性是通过 redo log (重做日志&…

解析CQRS架构模式

在日常开发过程中,关于如何正确划分操作的边界和职责一直是我们需要考虑的一个核心问题。针对这个问题,业界也诞生了一些新的设计思想和开发模式,其中最具代表性的就是今天要介绍的CQRS。 CQRS的全称是Command Query Responsibility Segregat…