volatile锁作用特点及其原理解析

目录

volatile概述

作用:

特点:

对比:

底层原理:

volatile如何保证可见性的

volatile如何保证有序性

为什么volatile不保证原子性


volatile概述

volatile可以理解为轻量级的synchronized。但他与synchronized不同,volatile只修饰变量,无法修饰方法和代码块。

作用:

防止指令重排序; 保持线程的可见性(可保障读操作是绝对准确的)

作用的解释:

1、计算机里面的指令重排序:计算机可能不按照我们写的代码指令顺序执行,而是会自己进行指令重排序(流水线技术)

2、可见性:指其中一个线程对共享变量做出操作的时候,其他线程可以准确无误地读出它的改变

(注意:final也有防止指令重排序,保障多线程下线程可见性的作用)

特点:

虽然volatile可保障读操作是绝对准确的(保证可见性),但读完之后往回写时,不能保证他是写准确的(不保证原子性)。(可能在“读后 写前”已经被其他线程修改啦)

对比:

synchronized锁可以保证写后读,保证读写操作的准确性(保证可见性+原子性),但是volatile锁只保证读操作的准确性

底层原理:

volatile如何保证可见性的

当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,当CPU发现这个指令时,立即会做两件事情:

将当前内核中的线程的缓存中的变量回刷新到系统主存中;
通知其他内核里缓存的该共享变量内存地址无效;

由此保证多线程可见性。

        MESI的核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

volatile如何保证有序性

 volatile是通过内存屏障来禁止指令重排的,这就保证了代码的程序会严格按照代码的先后顺序执行。这就保证了有序性。被volatile修饰的变量的操作,会严格按照代码顺序执行,load->add->save 的执行顺序就是:load、add、save。如经典的双重校验锁必须加volatile的问题,就是因为volatile加了内存屏障。

为什么volatile不保证原子性

volatile仅保证单个操作的原子性:在Java中,volatile仅保证对单个volatile变量的读操作和写操作是原子的。这意味着,当一个线程读取或写入一个volatile变量时,这个操作是不可中断的。但是,这并不意味着复合操作(如i++)是原子的。

复合操作的非原子性:对于像i++这样的复合操作,它实际上包含三个步骤:读取i的值、将i的值加1、将新值写回i。由于volatile只能保证每个步骤的原子性,而不能保证整个复合操作的原子性,因此当多个线程同时执行这样的操作时,就可能出现数据不一致的问题。

内存可见性与原子性的区别:volatile通过内存屏障等机制保证了变量的内存可见性,即当一个线程修改了volatile变量的值后,这个新值对其他线程是立即可见的。然而,这并不意味着volatile能够保证复合操作的原子性。内存可见性和原子性是两个不同的概念,前者关注的是变量值的传播速度,而后者关注的是操作的不可分割性。

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

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

相关文章

数据结构——单链表OJ题(上)

目录 一、移除链表元素 1.思路 2.注意 3.解题 二、反转链表 思路1:三指针翻转法 (1)注意 (2)解题 思路2:头插法 (1)注意 (2)解题 三、链表的中间结…

AWS 中国区同账号0etl integration配置步骤

中国区的AWS支持0etl integration已经一段时间了,目前北京区和宁夏区均支持。中文翻译为零ETL集成。 当前支持的引擎是Aurora MySQL数据托管式导出到Redshift. Global区域支持Aurora PostgreSQL. 中国区后续也会陆续出现此功能的。 功能介绍文档: 【1…

正则表达式的匹配模式有那些?

1、不区分大小写模式(IgnoreCase): 在匹配文本字符串时,不区分文本字符串中的大小写。 在不同编程语言中,此模式的指定方式可能有所不同。例如,在Python中,可以使用常量re.I或re.IGNORECASE&a…

try-catch-finally 捕获异常不在catch里抛出;循环遍历对象生成任务,捕获异常对象不抛出,不影响其他正常对象生成任务

场景:一个模板绑定多个对象,要对每个对象生成任务。捕获生成任务过程中的异常,但是不抛出,只是用日志记录。这样做目的:循环遍历对象生成任务时,异常对象数据生成任务时发生异常只是导致自己生成任务失败&a…

Mac应用快速启动器:Alfred 5 for Mac 激活版

Alfred 5 是一款专为 macOS 系统设计的效率提升工具。这款软件以其快速启动和高效操作功能著称,通过使用快捷键来呼出输入界面,用户可以快速完成各种任务。 最新版本 Alfred 5.5 引入了一些新功能。其中包括整合了 ChatGPT 和 DALL-E,这意味…

YOLOv8不同位置引入RepVGG重参数化

一、原理解析: 复杂的卷积网络大都具有如下缺点: 复杂的多分支设计(如ResNet中的残差相加和Inception中的分支连接)使模型难以实现和自定义,降低了推理速度和降低了内存利用率。一些组件(例如Xception和Mo…

RedisTemplate、StringRedisTemplate、序列化器配置

Lettuce和Jedis RedisTemplate是SpringDataRedis中对JedisApi的高度封装,提供了Redis各种操作、 异常处理及序列化,支持发布订阅。 首先我们要知道SpringData是Spring中数据操作的模块,包括对各种数据库的集成,比如我们之前学过…

Flutter——全网最精致木鱼APP可上架应用市场

研发背景 工作之余,闲来无事,想着研发一款用户可能会经常用到的一款APP,并且能够顺便掌握一下Flutter Material Design 3 UI,所以就有了这款比较精致的木鱼APP的诞生。 开源代码 https://github.com/z244370114/woodenfish

语义分割介绍

1. 定义 语义指具有人们可用语言探讨的意义,分割指图像分割。 语义分割(semantic segmentation)能够将整张图的每个部分分割开,使每个部分都有一定类别意义(语义),让计算机可以理解图像。 语义分割是以描边的形式&…

【初阶数据结构篇】顺序表和链表算法题

文章目录 顺序表算法题移除元素删除有序数组中的重复项合并两个有序数组 链表算法题移除链表元素反转链表链表的中间结点合并两个有序链表链表分割链表的回文结构 顺序表算法题 不熟悉顺序表的可以先了解一下 顺序表实现方法 移除元素 给你一个数组 nums 和一个值 val&#x…

基于Xejen框架实现的C# winform鼠标点击器、电脑按键自动点击器的软件开发及介绍

功能演示 文章开始之前,仍然是先来个视频,以便用户知道鼠标连点器的基本功能 软件主界面 多功能鼠标连点器 快速点击: 痕即鼠标点击器可以设定每秒点击次数,让您轻松应对高频点击需求。 切换时长,即每次动作之间的间…

【安卓】Android Studio简易计算器(实现加减乘除,整数小数运算,正数负数运算)

目录 前言 运算效果 一、创建一个新的项目 二、编写xml文件(计算器显示页面) 三、实现Java运算逻辑 ​编辑 完整代码 xml文件代码: Java文件代码: 注: 前言 随着移动互联网的普及,手机应用程序已…

Linux_基础

文件结构 Linux的文件结构是一个倒的树状图,具体结构如下: bin:存放二进制文件 boot:存放系统启动文件 dev:存放设备文件 etc:存放系统管理时要用到的各种配置文件和子目录 lib:存放系统动…

【Vue2】3-使用Vue脚手架

目录 初始化脚手架 说明 具体步骤 模板项目的结构 关于不同版本的Vue vue.config.js配置文件 ref属性 配置项props mixin(混入) 插件 scoped样式 总结TodoList案例 webStorage(浏览器本地存储) TodoList本地存储 组…

UE4Editor.exe运行与调试 “-run=XX” 命令行

如果看到这么一条工作命令: %EnginePath%\Binaries\Win64\UE4Editor-Cmd.exe %ClientPath%\%ProjectName%.uproject -runHotPatcher {其它配置} 它意味着命令行,“-run” 后面接的内容是命令行, class UHotPatcherCommandlet :public UComma…

【初阶数据结构篇】栈的实现(赋源码)

文章目录 栈1 代码位置2 概念与结构1.1概念1.2结构 2 栈的实现2.1 栈的初始化和销毁2.1.1 初始化2.1.2 销毁 2.2 栈顶插入和删除数据2.2.1 栈顶插入数据(压栈)2.2.2 栈顶删除数据(出栈) 2.3 返回栈顶数据2.4 返回栈的有效数据个数…

C++类型强转

C(四)类型强转 新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强 制转换。C提供了四种转化 static_cast,reinterpret_cast,dynamic_cast 和 const_cast 以满足不同需求,C风格的强制转换好处是&#xff…

【深度学习】语音合成,TTS,PaddleSpeech

https://paperswithcode.com/task/text-to-speech-synthesis https://github.com/PaddlePaddle/PaddleSpeech https://github.com/coqui-ai/TTS https://github.com/keonlee9420/Expressive-FastSpeech2 https://github.com/TensorSpeech/TensorflowTTS docker镜像&#x…

【笔记】人工智能大模型在电力系统运行控制中的应用综述及展望

据统计,截至 2019 年底,我国风电和光伏的装机容量已经达到 415 GW,美国的可再生能源全年发电量已超过燃煤发电,同时欧洲计划在 2050 年完成 100% 可再生能源互联电网的建设。为了响应国家提出的“碳达峰”“碳中和”政策,国家电网公司提出在有效保障能源安全供应的前提下,…