多线程--CAS原子操作

Java多线程与并发编程:原子操作与CAS陷阱!超市自助结账的智慧(9) 【代码】Java多线程与并发编程:原子操作与CAS陷阱!超市自助结账的智慧(9) 阅读详情

一.什么是CAS?

CAS (Compare-and-Swap)即比较并交换,是一种并发编程中的原子操作机制。它通过比较内存中的值与预期值,若一致则更新为新值,整个过程原子化(不可中断),能有效解决多线程对共享数据的安全访问问题,是实现锁机制和无锁编程的重要基础。

CAS虽然涉及比较交换赋值等多个操作,但是在机器指令中是一条原子的指令不可拆分,跟ADD,LOAD等是一样的,cup对于线程的调度必须要执行完这一条指令,所以是天然的线程安全的,正因为有了这一条指令,我们才能在此基础上大做文章。解决各种安全问题,就比如上述无锁机制等等

 二.CAS的应用

1.实现原子类

 看这个代码

import java.util.concurrent.atomic.AtomicInteger;

//使用原子类
public class Demo {
    private static AtomicInteger count = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count.getAndIncrement();//这个类似于count++
      
                // count.incrementAndGet();//这个类似于++count
                
                // count.getAndDecrement();//类似于count--
              
                // count.decrementAndGet();//类似于--count

                //count.addAndGet(5);//这个相当于count+=5

            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count.getAndIncrement();
            }
        });
        t1.start();
        t2.start();
        System.out.println(count.get());
    }
}

可以看到两个线程同时对一个变量自增虽然没有涉及加锁,但没有涉及线程安全问题

 

 

2.实现自旋锁

 三.CAS的ABA问题

大部分情况下,就算是出现ABA问题,也没啥太大影响,但是如果遇到一些极端场景,就不一定了,举个例子:


假设我有 100 存款. 我想从 ATM 取 50 块钱. 第一次按取款,取款机没反应(极端情况1),又按下了一次,于是取款机创建了两个线程, 并发的来执行 -50 操作.

我们期望一个线程执行 -50 成功, 另一个线程 -50 失败.
如果使用 CAS 的方式来完成这个扣款过程就可能出现问题


正常的过程

存款 100. 线程1 获取到当前存款值为 100, 期望更新为 50; 线程2 获取到当前存款值为 100, 期望更新为 50.
线程1 执行扣款成功, 存款被改成 50. 线程2 阻塞等待中.
轮到线程2 执行了, 发现当前存款为 50, 和之前读到的 100 不相同, 执行失败.


异常的过程


存款 100. 线程1 获取到当前存款值为 100, 期望更新为 50; 线程2 获取到当前存款值为 100, 期望更新为 50.
线程1 执行扣款成功, 存款被改成 50. 线程2 阻塞等待中.
在线程2 执行之前, 我的朋友正好给我转账 50(极端情况2), 账户余额变成 100 !!
轮到线程2 执行了, 发现当前存款为 100, 和之前读到的 100 相同, 再次执行扣款操作
这个时候, 扣款操作被执行了两次!!! 都是 ABA 问题搞的鬼!!

虽然ABA问题的出现概率很小,但是要不能忽略,假设出现概率是万分之一,每天有十亿次请求,那么每天就会有十万次错误 

 

 

 四.java中基于CAS实现的原子类

 

 五.CAS在ConcurrentHansMap中的应用

相较于HashMap和HashTable,ConcurrentHashMap的改进

 由于synchronized随便拿个对象都能当锁,就可以使用每个链表的头结点来当锁对象

 

 也有CAS的体现size++上面,一定程度的减少了加锁的开销

 

C++时间复杂度分析 如果想要知道一个程序运行需要花费多少时间,直接运行测试不是更简单更准确吗?何必去花精力推算复杂度!首先,这个想法没问题,确实可以直接跑出来,但这属于马后炮,无法提前预估算法的时间复杂度,而且也非常受限:1、测试结果在不同处理器上运行的结果会有很大波动2、即使在同一环境下运行,不同数据也会导致结果有很大波动所以需要一个不用具体测试就能评估程序执行效率的方法,也就是时间、空间复杂度分析方法。 阅读详情

相关推荐

手机OIS马达拆解:从苹果的悬丝到三星的滚珠,不同方案如何影响你的拍照体验?

本文深度解析手机OIS马达技术,对比苹果悬丝式、三星滚珠式和LG记忆合金式三种主流方案的机械原理与成像体验差异。通过详实的数据和测试结果,揭示不同OIS技术如何影响防抖性能、模组厚度及长期可靠性,为摄影爱好者和技术爱好者提供实用选购建议。

weixin_42554408的博客 303

多线程进阶——CAS

摘要: CAS(Compare and Swap)是一种无锁并发机制,通过比较内存值与预期值实现原子操作。其核心是一条CPU指令,具备高效、线程安全特性,广泛应用于原子类(如AtomicInteger)和自旋锁的实现。但CAS存在ABA问题:若共享变量被其他线程修改后恢复原值,可能导致逻辑错误。解决方案是引入版本号机制,每次修改递增版本号,确保操作时版本一致,避免ABA风险。例如银行扣款场景中,版本号可有效防止余额反复变动引发的并发问题。CAS在保证性能的同时,需结合版本控制提升数据一致性。

2301_79204376的博客 1036

用AI+Playwright实现零代码UI自动化测试:以登录页面为例的实战指南

本文详细介绍了如何利用AI与Playwright结合实现零代码UI自动化测试,特别以登录页面为例进行实战演示。通过自然语言描述生成测试脚本,大幅降低技术门槛,提升测试效率,并支持跨浏览器验证。适合非技术人员快速上手专业级自动化测试。

weixin_28842269的博客 401

【多线程】详解 CAS 机制

本文主要介绍CAS机制是什么及具体操作步骤,并介绍CAS机制的应用,实现原子类和自旋锁,最后介绍CAS机制可能带来的问题ABA问题,以及解决方案,引入版本号。

爱编程爱运动的博客 4842

【人工智能】AI算法系统设计与算法建模的详细阐述

AI算法系统设计与算法建模是人工智能领域中的核心任务之一,它涉及从问题定义、数据收集、算法选择、模型构建到系统部署的全过程。以下是对AI算法系统设计与算法建模的详细阐述

weixin_51306394的博客 4355

立创开源便携式多生理参数监护仪:基于STM32H743与ADS1292R的心电血氧体温监测系统设计

本文详细解析了基于STM32H743与ADS1292R的便携式多生理参数监护仪开源设计。项目集成了心电、血氧和体温监测功能,采用模块化硬件架构,并重点介绍了利用FIR滤波和Pan-Tompkins算法进行心电信号处理的核心技术。文章提供了完整的复刻指南与避坑要点,是学习医疗电子设备设计的优秀实践案例。

weixin_30600615的博客 326

【多线程】CAS详解

目录 一、什么是CAS 二、CAS 是怎么实现的 三、CAS 应用 实现原子类 实现自旋锁 四、CAS 的 ABA 问题 什么是 ABA 问题 ABA问题引来的BUG 解决方案 一、什么是CAS CAS: 全称Compare and swap,字面意思:”比较并交换“,一个 CAS 涉及到以下操作: 我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。 1. 比较 A 与 V 是否相等。(比较) 2. 如果比较相等,将 B 写入 V。(交换) 3. 返回操作是否成功

耀的博客 4033

OpenHarmony-AI调研

基于OpenHarmony-5.0.0版本以及laval社区等网络资料调研当前OH上的AI发展情况。

qqq1112345的博客 1367

多线程—CAS

概念:CAS(Compare And Swap)是对一种处理器指令的称呼。 先看一段代码: private static int count = 0; public static void add(){ count++; } 如果多个线程调用add()方法,会有线程安全问题: 第一,count静态变量的可见性问题。 第二,count++操作的原型性问题。 那么如何解决呢? 第一种方案:将count++放在synchronized同步代码块里,原子性和可见性都可以解决,但

qq_42251944的博客 1530

5G核心技术:N3与N4接口深度解析

5G网络中,N3和N4接口是实现用户数据传输的核心。N3接口是gNB与UPF之间的用户面通道,采用GTP-U协议封装数据,通过UDP/IP传输,确保低时延和业务隔离。N4接口是SMF与UPF之间的控制面链路,基于PFCP协议下发转发规则(FAR/TDR/QER/URR),实现精细化流量控制。二者协同工作:N4下发策略(如QoS、计费规则),N3执行数据转发,共同支持5G三大场景(eMBB/uRLLC/mMTC),体现控制与转发分离(CUPS)架构优势。

Qinti_mm的博客 1632

FPGA篮球计分器:从需求分析到模块化实现的实战指南

本文详细介绍了FPGA篮球计分器的设计与实现,涵盖需求分析、模块化设计及实战调试。重点解析了24秒精确倒计时、12分钟比赛计时、比分统计和数码管显示等核心模块的Verilog实现,提供了按键消抖、状态机设计和BCD码处理等关键技术细节,帮助开发者掌握FPGA数字系统设计方法。

sql99的博客 217

java多线程(2)之CAS操作

CAS:Compare and Swap即比较交换技术,它在高并发开发中是很重要的技术,在了解什么是CAS操作之前我们首先需要简单了解下sun.misc.UnSafe类。UnSafe类中的很多方法都是Native方法,没法直接调用,只能通过JNI操作调用本地方法,这里列举个里面的本地方法:public native long objectFieldOffset(Field var1); 获取对象中给

stormCoder的博客 470

MFC Windows 程序设计[122]之树形下拉列表框(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。.........

hnjzfwy的博客 458

Java多线程系列之:原子操作CAS

一,什么是原子操作?如何实现原子操作 1,synchronized可以完成原子操作,他是给予阻塞的锁的机制,但是有问题:   如果被阻塞的线程优先级很高怎么办?  拿到锁的线程一直不释放锁怎么办?  有大量线程进行竞争,消耗cpu。还容易出现死锁  锁的粒度比较大,影响性能。 二,CAS的原理(Compare And Swap:比较交换) 1,从指令级别保证这是一个原子操作。 ...

weixin_30558305的博客 92

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java多线程并发之原子操作-CAS以及原子类atomic

毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节。

2401_85112250的博客 371

IMSL CNL 7.0.0 (x86-64)Crack

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

Java多线程之CAS及原子操作

CAS 操作时抱着乐观的态度进行的,它总是认为自己可以成功完成操作。所以CAS也叫作乐观锁,那什么是悲观锁呢?悲观锁就是我们“家喻户晓”的synchronized。悲观锁的思想你可以这样理解,一个线程想要去获得这个锁但是却获取不到,必须要别人释放了才可以。现在我们使用AtomicInteger类并且调用了incrementAndGet方法来对a进行自增操作。这个incrementAndGet是如何实现的呢?我们可以看一下AtomicInteger的源码。

老猫喜欢今日爬山的博客 223

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Java多线程】原子操作实现之CAS

目录 1 前言 2 CAS机制 3 CAS实现原子操作的弊端 3.1ABA问题 3.2 循环时间长开销大 3.3 只能保证一个共享变量的原子操作 1 前言 Java中除了使用锁来实现原子操作外,还大量的使用了CAS机制来实现对共享资源的原子操作。从JDK1.5版本开始,JDK的并发包中提供了以Atomic开头的类,来支持原子操作,比如AtomicBoolean,AtomicInt...

奋进的小白粥 233

java 利用CAS原子操作实现多线程竞争资源抢券

【代码】java 利用CAS原子操作实现多线程竞争资源抢券。

w820896059的专栏 319

多线程_高级主题_CAS_原子操作

锁有很多种叫法,根据不同的角度可以做不同的分类,比如是否沿用,我们分为可重入和不可重入,可重入还可以分为公平锁和不公平锁,所谓公不公平就在于这个锁在用的时候会加到队列里面,如果你按原先的队列的先后顺序去用这个锁的话称为公平锁,如果是不按这个队列顺序突然有个插队的,这个就称为不公平锁。 比如说还有自选锁、阻塞锁以及悲观锁、乐观锁等等等等有很多。 package com.sxt.others; i...

weixin_43003240的博客 227

Java多线程:CAS原子操作(四)

Java 并发机制实现原子操作有两种: 一种是锁,还有一种是CAS。在Java中,锁在并发处理中占据了一席之地,但是使用锁有一个不好的地方,就是当一个线程没有获取到锁时会被阻塞挂起,这会导致线程上下文的切换和重新调度开销。Java提供了非阻塞的volatile关键字来解决共享变量的可见性问题,这在一定程度上弥补了锁带来的开销问题,但是volatile只能保证共享变量的可见性,不能解决读一改一写等的原子性问题。CAS即CompareandSwap,其是JDK提供的非阻塞原子性操作,它通过

weixin_46204877的博客 1329

【多线程】有了解过 CAS 和原子操作吗?

什么是CAS;什么是原子操作;CAS执行流程;Java中的原子操作类;Unsafe;Unsafe实现CAS的工作原理;CAS的缺点

借他一双眼,愿这盛世如先生所愿 1602

单片机 原子性操作_多线程之原子变量CAS算法

上篇博文,我们介绍了多线程之内存可见性Volatile,但是也遗留了一个问题,如何保证变量的”原子性操作(Atomic operations)”?Volatile保证部分类型的原子性上篇博文,我们说Voloatile不能保证原子性,有一点局限: 因为在32位(4字节)处理器中,Java中读取long类型变量不是原子的,需要分成两步,如果一个线程正在修改该long变量的值,另一个线程可能只能看到该值...

weixin_39736150的博客 280

多线程中的CAS操作:实现原子性更新共享变量的值

它的核心思想是通过比较内存地址上的值和期望值是否相等来确定是否可以进行更新操作,从而避免多线程条件下的竞态问题。CAS 操作的基本原理是:当多个线程同时访问同一个共享变量时,首先会将共享变量的值读取到本地内存中,然后进行操作后再写回共享变量。通过了解和理解 CAS 操作的基本原理和应用场景,我们可以更好地应对多线程编程中的并发控制问题,保证数据的一致性和正确性。ABA 问题是指当一个共享变量的值从 A 变成了 B,然后再变成了 A,这时如果只比较值是否相等,就会出现误判的情况。对本地内存中的值进行操作;

Y666_788的博客 125

一段JAVA代码了解多线程,JUC、CAS原子性操作。

@Test public void testPaceController_multiThread() throws InterruptedException { final PaceController paceController = new PaceController(1000, 160d); final Node node = mock...

weixin_34252090的博客 84

Java中的CAS(Compare and Swap)是一种并发编程技术,用于实现多线程环境下的原子操作

CAS操作的优点是避免了锁的开销,因为它不需要阻塞其他线程。然而,CAS操作也存在一些问题,例如ABA问题和自旋次数过多导致的性能问题。Java中的CAS(Compare and Swap)是一种并发编程技术,用于实现多线程环境下的原子操作。它通过比较内存中的值与预期值是否相等来判断共享变量是否被修改,并在满足条件时进行更新。它通过比较内存中的值与预期值是否相等来判断是否进行更新,并且在更新时保证原子性。否则,说明其他线程已经修改了该位置的值,CAS操作失败。

[Blog][Domain] programb.blog.youkuaiyun.com 1031
上一篇: 多线程--定时器
下一篇: Java文件操作/IO
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值