多线程教程(二十四)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 来优化性能,避免锁带来的性能损失。特别适用于计数器、队列等需要频繁修改的共享变量。 阅读详情

相关推荐

ESP32使用microPython控制240x240彩色屏幕显示中文

王铭东老师详细讲解了讲了关于240x240屏幕的一些基础东西,我这里在原功能的基础上拓展了中文显示的功能,顺带修改了实际操作过程中程序中遇到的一些问题。

m0_59452630的博客 1万+

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

Unity 数字孪生实战:PiXYZ Plugin工业模型高效处理指南

本文是Unity数字孪生实战指南,重点介绍了如何使用PiXYZ Plugin高效处理工业CAD模型。针对工业模型导入Unity时面临的格式壁垒、数据爆炸和资产混乱等核心痛点,文章提供了从环境安装、基础导入到智能减面、资产清理的完整解决方案,并分享了预设自动化、运行时导入等高级技巧与性能优化策略,帮助开发者快速打通工业设计与实时交互流程。

weixin_29009501的博客 256

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

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

iqqcode 1260

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 634

LVGL colorwheel组件教程一(调色板)

【代码】LVGL colorwheel组件教程一(调色板)

摸鱼专家 431

Java并发编程-CAS乐观锁

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

weixin_56446161的博客 434

【C语言】字符常量详解

字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。

LuckiBit 5017

谈谈你对volatile的理解

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

MrShanQIu的博客 506

得物(毒)App潮鞋价格波动监控系统实战:从爬虫开发到数据可视化完整指南

本文将带领您从零开始构建一套完整的得物潮鞋价格监控系统,涵盖爬虫开发、数据存储、价格波动分析和可视化展示等全流程技术。我们将使用最新的Python技术栈,包括异步爬虫框架、智能代理池、反爬虫绕过技巧,以及基于机器学习的时间序列预测模型。无论您是想要追踪特定鞋款价格的潮流爱好者,还是希望构建商业级监控系统的开发者,这篇文章都将为您提供切实可行的解决方案。

2201_76125261的博客 2504

[NoC]Outstanding和Credit的概念详解

摘要:本文详细解析了计算机体系结构中outstanding和credit两个核心概念。outstanding指已发出但未完成的请求数量,通过跟踪未决事务实现并发和乱序执行,常见于AXI总线等场景;credit则是基于信用令牌的流控机制,通过控制发送速率防止接收端缓冲溢出,多用于NoC网络。二者在目的、机制上存在差异:outstanding侧重提升并发度,credit关注流控保护。文章通过AXI协议实例和SystemC代码示例展示了二者的应用与结合方式,并探讨了在SoC设计中参数优化的方法,包括性能/资源权衡

元直的博客 2282

CAS(Compare and swap)

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

qq_42266891的博客 314

Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程

本文主要介绍了Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程,希望能对使用Codex的同学们有所帮助。 文章目录 1. 背景 2. 实战教程

weixin_43178406的博客 6万+

Volatile与CAS的底层原理

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

rekingman的博客 4366

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

volatile和CAS的关系

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

Hell_potato777的博客 3384

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

并发--volatile+CAS的使用

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

你我约定有三的博客 1270

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、付费专栏及课程。

余额充值