重新认识的volatile关键字

深入解析volatile关键字:从内存模型到嵌入式实战应用 在计算机编程中,内存访问优化是编译器提升程序性能的核心手段之一,它通过分析代码的数据流和控制流,消除冗余计算和内存访问。然而,这种优化机制在面对特定场景时可能引发问题,例如硬件寄存器操作和异步信号处理。volatile关键字正是为了解决这类“内存访问不可预测性”问题而设计,它强制编译器不对指定变量的读写进行优化,确保每次访问都直接作用于内存。这一特性在嵌入式系统开发、设备驱动编程以及对实时性要求极高的领域具有重要技术价值,能够有效处理内存映射I/O、中断服务程序修改的全局变量等场景。通过理解volatile 阅读详情

1. 加锁与可见性

内置锁可以用于确保某个线程以一种可预测的方式来查看另一线程的执行结果。

当线程A执行某个同步代码块时,线程B随后进入由同一个锁保护的同步代码块,在这种情况下可以保证,在释放锁之前,A看到的变量值在B获得锁后同样可以由B看到。即当线程B执行由锁保护的同步代码块时,可以知道线程A之前在同一个同步代码块中的所有操作结果。这也符合Happen-before原则,即A Happen-before B。

基于此我们在访问某个共享且可变的的变量时要求所有线程在同一锁上同步,就是为了确保写入该变量的值对于其他线程而言都是可见的,否则,如果一个线程在未持有正确锁的情况下读取某个变量,那么读到的可能是一个失效值。

加锁的含义并不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。

2. Volatile变量

Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量为共享变量,因此不会将该变量上的操作与其他内存操作一起重新排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量的时候总会返回最新写入的值。

在访问volatile变量时不会执行加锁操作,因此也就不会执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。

使用volatile变量的条件:

  • 对变量的写入操作不依赖于变量的当前值,或者你能确保只有单个线程更新变量的值。
  • 该变量不会与其他状态变量一起纳入不变性条件中。
  • 在访问变量时不需要加锁。

总结:加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。

别再乱用volatile了!聊聊C语言里这个关键字在STM32和Linux多线程里的真实用法 本文深入解析了C语言中`volatile`关键字的正确用法,特别针对STM32嵌入式开发和Linux多线程编程场景。通过对比硬件寄存器访问与线程同步的需求,揭示了`volatile`仅解决编译器优化问题而非线程安全的本质,并提供了替代方案如`stdatomic.h`和互斥锁的正确使用方式。 阅读详情

相关推荐

C语言32个关键字深度解析:从内存模型到实战避坑指南

在编程语言中,关键字是构成语法和语义的基础元素,它们定义了数据类型、控制流程和存储属性等核心概念。理解关键字的底层原理,有助于掌握程序的内存模型、编译器优化机制以及代码的执行逻辑。从技术价值看,深入理解关键字能提升代码的健壮性、可维护性和性能,尤其在系统编程、嵌入式开发等底层领域至关重要。在实际应用场景中,诸如`static`用于封装模块内部状态、`const`确保数据不可变性、`volatile`防止编译器错误优化等,都是工程实践中的常见模式。本文聚焦于C语言的32个关键字,通过剖析`static`、`c

weixin_33826609的博客 427

Java volatile 关键字深度解析:原子性与指令重排序的 2 大误区

在 Java 并发编程的世界里,volatile 关键字就像一位神秘的特工——它身怀绝技却常被误解。许多开发者对它的认知停留在"保证变量可见性"的层面,却忽略了其背后更为复杂的运作机制。本文将聚焦 volatile 最易被误用的两个特性:原子性缺失与指令重排序限制,通过 JMM(Java 内存模型)原理剖析和实战代码演示,带您重新认识这位并发编程中的"双面特工"。当我们在多线程环境中共享变量时,常常会看到这样的错误认知:"只要加上 volatile 修饰,这个变量的操作就是线程安全的"。

weixin_31714129的博客 302

原子性、内存可见性和重排序——重新认识synchronized和volatile

原子性、内存可见性和重排序——重新认识synchronized和volatile 一、原子性 原子性操作指相应的操作是单一不可分割的操作。例如,对int变量count执行count++d操作就不是原子性操作。因为count++实际上可以分解为3个操作:(1)读取变量count的当前值;(2)拿count的当前值和1做加法运算;(3)将加完后的值赋给count变量。 在多线程环境中

ljheee的博客 3434

重新认识volatile

1、CPU多核心缓存架构分析并发编程:肯定是为了更合理充分的利用多核CPU架构的性能 CPU 主频率远远高于主存,所以引入CPU缓存,CPU加载数据无法绕过缓存,而且对于多核CPU,一级缓存不是共享的,二级和三级缓存是线程共享的!CPU计算的数据并不是直接从主存中去拿,而且通过层层在缓存中寻找。 下图是一个单CPU多核心的架构图: 2、CPU缓存一致性协议先看这样一段代...

一枚野生程序员 —— Tim 619

告别QQ截图!用C# Winform + 百度AI,自己动手做一个免费的文字提取小工具

本文详细介绍了如何利用C# Winform和百度AI OCR接口开发一款免费的文字提取工具,替代QQ截图功能。通过智能截图模块、OCR服务集成和主界面功能整合,实现高效准确的文字识别,适用于日常办公和学习场景。工具支持图像预处理、异步处理和错误日志记录,提升用户体验和识别准确率。

weixin_30566063的博客 378

宇树机器人丝滑的二人转动作背后,MPC到底是什么?

了解MPC,让我们闻“机”起舞。

Barok的博客 2144

重新认识synchronized和volatile

重新认识synchronized和volatile 点关注不迷路,欢迎再来! 一.原子性(Atomic)操作指相应的操作时单一不可分割的操作 例如:对int型变量count执行counter++的操作就不是原子操作。因为counter++可以分解为3个操作: 1.读取counter的当前值; 2.那counter的当前值和1做加法运算; 3.将counter的当前值增加1后的值赋值给...

最初的节奏 465

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 348

多线程编程重新认识Volatile & synchronized

说明:转载本人掘金文章 https://juejin.cn/post/7082242009242550285 as-if-serial语义 as-if-serial语义初衷是为了提高指令执行速度(指令执行顺序优化),大概语义是保证在单线程情况下可以允许多个指令在没有数据依赖的情况下可以进行指令重排。 数据没有依赖 public static void test3(){ int a=0,b=0; a=1; //和b=1没有数据依赖 b=1; //和a=1没有数据依赖 } 这种情况

weixin_38312719的博客 189

时间序列分析(Time Series Analysis) 原理与代码实例讲解

时间序列分析(Time Series Analysis) - 原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词:时间序列预测,ARIMA模型,状态空间模型,SARIMA模型,机器学习

AI天才研究院 1246

javascript 酷炫时钟

javascript 酷炫时钟

liuhao9999的博客 631

高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)

文章目录概述例子 概述 这里我们逐步的揭开volatile的面纱 我们知道,在多线程并发编程中synchronized和volatile都扮演着重要的角色。 volatile是轻量级的 synchronized,它在高并发中保证了共享变量的“可见性”。 那什么是可见性呢? 可见性 我们可以理解为:当一个线修改一个共享变量时,另外一个线程能读到这个修改的值。 如果volatile变量修饰符使用恰的...

小工匠 2万+

路径规划 | 详解混合A*算法Hybrid A*(附ROS C++/Python/Matlab仿真)

Hybrid A*算法通过结合连续状态空间搜索、运动约束考虑和轨迹优化等技术,弥补了普通A*算法在高维连续空间和的不足,提高了路径规划的效率和鲁棒性,广泛应用于车规级路径规划。本文详细图解Hybrid A*算法的原理——启发式、维诺耗散项、节点扩展法则等,并给出ROS C++、python、matlab三种语言的仿真实现加深理解

FRIGIDWINTER的博客 1万+

重新认识synchronized和volatile-----原子性、内存可见性和重排序

       原子(Atomic)操作指相应的操作是单一的不可分割的操作。例如,对int型变量count进行count++的操作就不是原子操作。这是因为count++实际上可以分解为3个操作:            1)读取变量count的当前值;            2)拿count的当前值和1做加法运算;            3)将count的当前值增加1后的值赋值给count变量。1.S...

TyStk@..... 638

嵌入式开发之瑞芯微RK356x--基本环境搭建

嵌入式环境搭建

NexyHO的博客 617

基于Django+Vue3的目标检测系统设计与实现,Web前后端分离,Vue3前台系统+Django后台管理系统开发,YOLOv11 Web目标检测,实现图片、视频和摄像头检测等功能,全网独发

基于Django+Vue3的智能目标检测系统设计与实现,Web前后端分离,YOLOv11 Web目标检测,Vue3前台系统+Django后台管理系统开发,实现图片检测、视频检测、摄像头检测、登录、注册和个人中心功能

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3667

高并发编程-重新认识Java内存模型(JMM)

文章目录从CPU到内存模型内存模型如何确保缓存一致性并发变成需要解决的问题 (原子性、可见性、有序性)内存模型需要解决的问题Java内存模型JMM的API实现原子性 synchronized可见性 volatile 、 synchronized 、 final有序性 synchronized 、volatile 从CPU到内存模型 高并发编程-通过volatile重新认识CPU缓存 和 Ja...

小工匠 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

synchronized volatile

原子性、内存可见性和重排序——重新认识synchronized和volatile 一、原子性 原子性操作指相应的操作是单一不可分割的操作。例如,对int变量count执行count++d操作就不是原子性操作。因为count++实际上可以分解为3个操作:(1)读取变量count的当前值;(2)拿count的当前值和1做加法运算;(3)将加完后的值赋给count变量。 在多线程环境中,非原

zilin-lynn的博客 278

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

重新认识单例模式,饿汉、懒汉、加锁、双重检锁、静态内部类

今天我们来重新认识下单例模式,虽然单例模式是Java中最简单的设计模式,但是实现方式涉及到了很多Java知识,下面我们重新学习下 饿汉式 public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance(){ return singlet

kl_Dreaming的博客 334

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

重新认识java-java中不常见的关键字

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33743703的博客 65

C++关键字在SLAM工程中的核心应用与性能优化实践

在C++编程中,关键字是构建程序逻辑和内存模型的基础元素,它们定义了变量的存储周期、类型控制、流程结构和现代语言特性。理解关键字的底层原理,如const的正确性、移动语义和noexcept优化,对于编写高性能、可维护的代码至关重要。这些技术价值在资源敏感和高实时性要求的领域尤为突出,例如机器人系统中的即时定位与地图构建(SLAM)。在SLAM工程实践中,工程师需要精确管理传感器数据流和计算资源,通过合理运用static进行生命周期管理、利用mutable实现线程安全缓存,以及结合右值引用优化大型点云数据的传

weixin_29281915的博客 303

重新认识一下JVM、JMM、JOM

JVM:Java virtual machine(java虚拟机)   我们都知道java语言是可以夸系统的,正是使用虚拟机技术,java可以编译成虚拟机可以识别的指令,然后在虚拟机上运行。不同的系统统一遵循java虚拟机规范(https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html)实现对应的虚拟机,当然,不同的厂商实现的j...

二次方生存 1060

对Java内存模型的理解

参考资料 1.京东架构师100分钟带你重新认识Java内存模型!让你面试无忧! 个人思考 要理解Java内存模型,首先需要了解计算机内存模型 volatile关键字底层实现主要是通过汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定)并回写到主内存 IA-32架构软件开发者手册对lock指令的解释: 会将当前处理器缓存行的数据立即回写到系统内存 这个回写内存的操作会引起其他CPU里缓...

赵大土的博客 316
上一篇: 计算机中的文件及不同的结构
下一篇: 线程封闭&栈封闭
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值