多线程教程(二十四)CAS+volatile

Java多线程——synchronized,volatile,CAS,ReentrantLock 当没有线程占用锁对象时处于无锁,当有一个线程占用该锁时变成偏向锁,偏向搜不是真的加锁,而是添加一种锁标记,如果之后没有发生锁竞争就无须开销锁资源,如果有锁竞争就添加自旋锁,自旋锁是一种轻量级锁,在锁冲突不激烈的情况下,在抢占不到锁时不会处于阻塞状态而会一致尝试抢占锁,当锁竞争激烈时,自旋锁不能马上获取到锁,就会膨胀为重量级锁,调用OS的mutex将没有抢占到锁的线程加入到阻塞队列中,重量级锁的具体执行过程如上述介绍。.lock前缀指令在多核处理器中会做2件事情:将当前工作内存中的变量的值写回到主内存中; 阅读详情

多线程教程(二十四)CAS+volatile

获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。

它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。即一个线程对 volatile 变量的修改,对另一个线程可见。

注意

volatile 仅仅保证了共享变量的可见性,让其它线程能够看到最新值,但不能解决指令交错问题(不能保证原子性)

CAS 必须借助 volatile 才能读取到共享变量的最新值来实现【比较并交换】的效果

像上一节介绍的AtomticInteger在方法内部对value进行了volatile修饰。所以不需要额外的volatile修饰。

为什么无锁效率高

无锁情况下,即使重试失败,线程始终在高速运行,没有停歇,而 synchronized 会让线程在没有获得锁的时候,发生上下文切换,进入阻塞。打个比喻

线程就好像高速跑道上的赛车,高速运行时,速度超快,一旦发生上下文切换,就好比赛车要减速、熄火,等被唤醒又得重新打火、启动、加速… 恢复到高速运行,代价比较大

但无锁情况下,因为线程要保持运行,需要额外 CPU 的支持,CPU 在这里就好比高速跑道,没有额外的跑道,线程想高速运行也无从谈起,虽然不会进入阻塞,但由于没有分到时间片,仍然会进入可运行状态,还是会导致上下文切换。
CAS 的特点

结合 CAS 和 volatile 可以实现无锁并发,适用于线程数少、多核 CPU 的场景下。

CAS 是基于乐观锁的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试呗。

synchronized 是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。

CAS 体现的是无锁并发、无阻塞并发,请仔细体会这两句话的意思

因为没有使用 synchronized,所以线程不会陷入阻塞,这是效率提升的因素之一

但如果竞争激烈,可以想到重试必然频繁发生,反而效率会受影响

Java开发者必懂:synchronized、volatile与CAS的使用场景与性能对比 通过这场并发战争的比喻,我们已经了解了volatile和CAS各自的特点及其优缺点。那么,在实际开发中,我们该如何选择它们呢?:当你需要保证一段代码的互斥执行,且操作较为复杂时,选择 synchronized。它的适用场景比较广泛,但性能较低。volatile:当你只需要保证变量的可见性时,volatile 是一种高效的解决方案。但它并不保证原子性,因此适用于标志位等简单场景。CAS:在高并发场景下,使用 CAS 来优化性能,避免锁带来的性能损失。特别适用于计数器、队列等需要频繁修改的共享变量。 阅读详情

相关推荐

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5661

JUC包下的原子类的实现方法

class AccountSafe implements Account { private AtomicInteger balance; public AccountSafe(Integer balance) { this.balance = new AtomicInteger(balance); } @Override public Integer getBalance() { return balance.get(); } @Override public void withdr

printfscanfmng的博客 343

MODTRAN5.2.1安装配置

MODTRAN5.2.1安装配置

Home 4255

CAS与volatile组合拳 无锁怎么保证线程安全的

CAS与volatile组合拳 无锁怎么保证线程安全的

iqqcode 1260

U8+ 新建账套

一、登录 账套主管:demo 对账套有修改权限,有账套库权限 系统管理员:admin 其他所有权限 二、新建账套 admin登录–>点击系统管理–>账套–>建立 选择了参照已有账套结转期初:就是上一个的期末数据作为这一次新表的期初数据 启用会计期一旦选择更改不了。 ...

茶茶很困i 3693

Chapter 7 Linear Voltage Regulators

这一章我们介绍LDO.

2304_76736886的博客 2763

Java并发编程-CAS乐观锁

主要介绍了Java并发编程中的CAS乐观锁。

weixin_56446161的博客 434

短距激光雷达专业讲解:定义、架构、技术路线与选型逻辑

短距激光雷达,通常指有效探测距离不大于 50 米的激光雷达产品。它主要服务于服务机器人、扫地机器人、AGV/AMR、无人机、智能手机、AR/VR、工业安全等中近距感知场景。它与车载中长距激光雷达的最大区别,不是“探测距离短一点”,而是整套工程目标不同。短距激光雷达的核心诉求是:小体积、低成本、高帧率、强抗光、嵌入式集成。单价从百元级扫地机模组,到数千元级工业 3D 雷达不等。一句话概括:中长距车载激光雷达追求远距离、高可靠、车规寿命;

致力于lidar应用开发 151

谈谈你对volatile的理解

一、volatile特性: volatile是Java虚拟机提供的轻量级的同步机制。主要有三大特性: 保证可见性 不保证原子性 禁止指令重排序 1、保证可见性 1)代码演示 AAA线程修改变量number的值为60,main线程获取到的number值是0,就一直循环等待。 原因:int number = 0;number变量之前没有添加volatile关键字,没有可见性。添加volatile关键字...

MrShanQIu的博客 506

SAP_MM模块非限制库存转冻结库存

项目非限制 → 冻结事务码移动类型343影响库存不可用,不参与MRP常见用途质量问题封存、盘点冻结、待退货品通过本文,我们了解了 SAP 的[SAP_MM模块非限制库存转冻结库存]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!文章中如有错误。敬请指正!搜索公众号:SAP资料文库微信号:SPRO_PP时间:2025-10-14。

我小时候很黑的博客 585

Vue2 - 最新详细实现网站内部打开预览 office 全套附件,在页面弹窗内解析预览 word文档、excel电子表格、ppt演示文稿(docx|xlsx|pptx|pdf|txt等文件)详细代码

vue2,nuxt2,office,文档,文件,查看预览,弹框预览,下载预览,如何预览pdf文档,打开查看,office全套文档,实现在线预览文件,小程序内预览word文件,手机h5移动端网页,nuxt文档在线预览,预览office最好用的插件,下载查看,Office在线预览,vue-office,vue如何使用vue-office教程示例,word文档,ppt,exce表格,预览电子文件,文档无法解析,打不开,报错,失效,保存下载,vue前端预览并下载doc、xls、pdf、txt及图片,vue2中预览p

🏆 前端领域优质创作者 1万+

CAS(Compare and swap)

原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分(不可中断性)。将整个操作视作一个整体,资源在该次操作中保持一致,这是原子性的核心特征。 CAS(Compare and swap) Compare and swap 比较和交换。属于硬件同步原语, 处理器提供了基本内存操作的原子性保证。 CAS操作需要输入两个数值,一个是旧值A(期望操作前的值)和一个新值B,在操作期间先对旧值进行比较,若没有发生变化,才交换成新值,发生了变化则不变换。 JAVA中的.

qq_42266891的博客 314

qcc514x-qcc304x调试笔记

qcc514x-qcc304x调试笔记-1-QCC514x系列 qcc514x-qcc304x调试笔记-2-开发环境搭建 qcc514x-qcc304x调试笔记-3-如何修改蓝牙名称 qcc514x-qcc304x调试笔记-4-如何修改蓝牙地址 qcc514x-qcc304x调试笔记-5-如何区分左右耳 qcc514x-qcc304x调试笔记-6-PIO相关操作 ...

leezs的博客 1244

Volatile与CAS的底层原理

Volatile与CAS的底层原理 引言:VOLATILE是JAVA中一个极其重要关键字,它保证的内存的可见性,但是并不能够保证原子性。而CAS是采用一种无锁的方式,解决VOLATILE所不能带来的原子性等这类问题。接下来,就讲讲VOLATILE与CAS吧! 一、volatile 在讲解 Volatile关键字之前,先上个小demo! private static volatile long ...

rekingman的博客 4366

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

volatile和CAS的关系

术语名称英文解释缓存行Cache line缓存的最小操作单位比较并交换Compare and SwapCAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。CPU流水线CPU pipelineCPU流水线的工作方式就象工业生产上的装配流水线,在CPU中由56个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5。

Hell_potato777的博客 3384

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

并发--volatile+CAS的使用

特性普通变量仅volatile仅CAS可见性保障❌✅❌✅单次读写原子性❌✅❌✅复合操作原子性❌❌✅(理论上)✅防止更新丢失❌❌❌✅避免死循环❌✅i++结果正确性随机可能错误死锁始终正确。

你我约定有三的博客 1270

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

synchronized、volatile以及CAS的区别

在讲解synchronized、volatile、CAS的区别之前,需要弄明白什么共享资源、什么是线程安全、线程间的可见性问题以及Java操作的原子性。弄明白这些问题可以加深你对synchronized、volatile、CAS的理解。下面我会先对这些问题进行简单的说明, 什么是资源共享? 同一个资源被多个线程所持有 或者说多个线程可以访问该资源,这样的资源称之为共享资源。 什么线程安全? 就是指多个线程同时读写同一个资源,并没有使用任何的同步措施,导致出现脏数据或者不可预见的结果。 ..

铭 2131

Java Unsafe CAS、volatile与可见性

多核CPU中光用lock+cmpxchg指令来保证原子、可见和禁止重排序是不够的,还需要C++在asm后紧跟volatile提供禁止GCC重排序功能。而Java volatile与Java CAS相比,Java CAS还缺失了Java volatile具有的禁止重排序功能,为什么???Java CAS用到了C++的volatile吗?没错,至少在JVM的C++层面实现是相同的,但是Java属于编译+解释型语言,Java在编译具有volatile的属性get/set时会自动添加能触发内存屏障的指令!!!而对于

ikun 的博客 967

CAS与Volatile

文章目录CASvolatilecas的特点为什么无锁效率高 CAS 全称是Compare And Swap 即比较和交换,是乐观锁的一种实现 一个取钱的例子: public class TestAccount { public static void main(String[] args) { Account account = new AccountCas(10000); Account.demo(account); } } class AccountC

Yrainy_D的博客 1349

多线程之Volatile与CAS原理

多线程之Volatile与CAS原理

qq_40223516的博客 737

CAS、volatile、synchronized

进程 操作系统资源分配的基本单位。分配内存、网络等。 线程 操作系统、CPU执行的基本单位 CAS CAS定义 CAS Compare And Swap 比较并交换 (自旋锁、无锁)。不需要加锁能保证线程同步、线程安全的机制。 cas(v,a,b) 变量v 期待值a 修改值b 内存中的值与a相等 则设置成功 否则自选继续设置 CAS底层实现 CAS的底层是UnSafe + CAS自旋 AtomicInteger原子类 AtomicInteger atomicInteger = new

qq_33271141的博客 257

Volatile是什么,CAS是什么:

轻量级的同步机制:保证可见性,不保证原子性,禁止指令重排。Volatile就是乞丐版的synchronizid 。 volatile实现禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象。 先了解一个概念,内存屏障又称内存栅栏,是一个CPU指令,它的作用有两个: 一是保证特定操作的执行顺序 二是保证某些变量的内存可见性(利用该特性实现volatile的内存可见性) 由于编译器和处理器都能...

happy_bigqiang的博客 1193

CAS与volatile关系以及如何保证原子性

一、CAS操作 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 (2)一个线程持有锁会导致其它所有需要此锁的线程挂起。 (3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。 volatile是不错的机制,...

zpzkitt的专栏 6857

java多线程——CAS

java 多线程—线程怎么来的? java多线程-内存模型 java多线程——volatile java多线程——锁 关于无锁队列,网上有很多介绍了,我做一个梳理,从它是什么再到有哪些特性以及应用做一个总结,方便自己记录和使用。 本文主要内容: 非阻塞同步是什么 CAS是什么 CAS特性 无阻塞队列 ABA问题 一、非阻塞同步 互斥同步属于一种悲观的并发策略,总认为只要不去...

weixin_42104181的博客 962

【Java多线程深度解析从volatile到CAS算法的底层实现原理】

机制 | 解决的问题 | 实现原理 || `volatile` | 可见性与指令重排序 | 内存屏障与JVM语义约束 || `CAS` | 原子性与无锁操作 | CPU指令级原子比较与交换 |`volatile`为跨线程写入提供了基础保障,而CAS在此之上实现了更复杂的原子操作,构成Java并发编程的基石。

tGyvbiUP的博客 770
上一篇: 多线程教程(二十四)CAS+volatile
下一篇: 多线程教程(二十五)原子数组
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值