JUC_2-原子变量 CAS算法

JUC之CAS(底层原理及源码) 阅读详情

原子变量 CAS算法

一、CAS算法

   public static void main(String[] args) {
        AtomicDemo demo = new AtomicDemo();
        for(int i=0;i<=10;i++){
            new Thread(demo).start();;
        }
    }

class AtomicDemo implements Runnable {
    private int number = 0;
    
    public void run() {
        //synchronized (AtomicDemo.class) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(number++);
        //}
    }
}

 就会出现  0 1 2 2 2 3 4 8 7 6 5

    控制台打印就会出现多线程问题 或者说出现原子性问题

 

1. 比如 i++问题

   i=10;

   i=i++;i的结果是10

     在计算机的底层 临时变量temp 有三部操作“读-改-写”  可以通过javap 反编译 看他是如何运行

             int temp = i;

             i=i+1;          i++可以看成 i=i+1

             i=temp; 先temp值赋给i 依然是10 然后再是

  可以看作 j=i++    temp=i; 然后 i是自增1,  i为10值赋给j 

 

对上述number 定义volatile 内存可见性,也无法保证线程安全问题,因为线程1与线程2再各自独立缓存中进行number++操作时,三个步骤读 改 写,先将主存中的number读到线程的工资内存中,number在加1,然后在将number值写入主存中,不具备原子性(原子特性是不可在分割的)

 

处理使用原子变量

二、原子变量:jdk1.5 后java.util.concurrent.atomic 包下提供了常用的原子 

               1. volatile保证了内存可见性(Atomic类中属性用volatile修饰)

               2. 用CAS(Compare And Swap)算法保证数据的原子性

                    CAS算法是硬件对于并发操作共享数据的支持 JVM支持CAS算法,JVM底层大量实现CAS算法

                    CAS算法包含了三个操作数:

                        内存值 V:从主存中取出值

                        预估值 A:对于非原子性的操作,再进行下一次计算操作之前,会再次读取主存中的值

                        更新值 B:根据具体的逻辑,有待跟新的值

                        条件满足:当且仅当V==A时,那么把B值赋给V(B=V);否则将不做任何操作

    线程1 首先读取主存中的共享资源值 V值为0(V=0),在进行替换时候,需要再读取主存中的旧值 A值为0(A=0),经过number++运算B更新值1。

    当线程1操作时,此时线程2将主存中的值读取V=0(线程1未进行写入主存的操作),在替换时,线程1对主存中的数据进行写入(此时number=1,V=A成立将B值写入),再对主存的旧值再进行读取A为1(A=1),B的值相较于V=0进行number++运行B=1。此时V为0,A为1 V!=A,不做任何操作

    如果多个线程并发的对主存的数据进行修改时有且只有一个线程会成功,其它线程都失败。

    CAS效率比锁效率高,因为CAS当线程失败以后,CPU不会放弃执行权,紧接着线程会再去尝试更新,所以要不原来同步所的效率高很多

class AtomicDemo implements Runnable {
    //private volatile int number = 0;
    private AtomicInteger number = new AtomicInteger();
    public void run() {
        //synchronized (AtomicDemo.class) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println( number.getAndIncrement() );
        //}
    }
}

简单的模拟CAS算法

public class TestCompareAndSwap {
    //简单的模拟CAS算法
    public static void main(String[] args) {
        final CompareAndSwap cas = new CompareAndSwap();
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int expectValue = cas.get();//读取主存中的值V
                    boolean b = cas.compareAndSet(expectValue, (int)(Math.random()*104));
                    System.out.println(b);
                }
            }).start();
        }
    }
}

class CompareAndSwap{
    //主存中的共享资源
    private int value;
    
    public synchronized int get(){//获取主存的值
        return value;
    }
    //比较
    public synchronized int compareAndSwap(int expectValue,int newValue){
        int oldValue = value;//在比较之前再获取主存值
        if(oldValue == expectValue){
            this.value = newValue;
        }
        return oldValue;
    }
    //设置
    public synchronized boolean compareAndSet(int expectValue,int newValue){
        return expectValue == compareAndSwap(expectValue, newValue);
    }
}

原子性理解

volatile关键字的深入理解  http://www.importnew.com/24082.html

 

 

 

 

 

【超详解】C++原子变量atomic,全面解密! 原子类型的对象包含特定type ()的值。原子对象的主要特征是,从不同的线程访问这个包含的值不会导致数据竞争(即,这样做是明确定义的行为,访问正确排序)。通常,对于所有其他对象,导致同时访问同一对象的数据争用的可能性将操作限定为未定义行为。【官方介绍】。此外,对象能够通过指定不同的内存顺序来同步对其线程中其他非原子对象的访问。原子操作在多线程中可以保证线程安全,而且效率会比互斥量好些。 阅读详情

相关推荐

华为昇腾Atlas200DK. CANN模型推理——目标检测结果不对(无检测结果)的问题解决

目录前言问题描述问题排查1.后处理模块问题排查2.预处理模块问题排查3.模型问题排查4.算法bug问题排查5.AI板卡问题排查6.模型精度问题排查6.模型推理问题解决:模型输入数据与预处理不同后记 前言 上周我在华为昇腾Atlas200DK中部署nanodet和yolov5时,出现了目标检测结果不对(没有检测到任何物体),困扰了整整三天,最后找到原因并圆满解决,在这里记录一下debug过程。 以上测试均在python中完成。 问题描述 第一天上午,我首先将nanodet由pytorch的.pth模型转换为.

qq_41035283的博客 5605

c++原子变量

​ C++11提供了一个原子类型std::atomic<T>,通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数(不支持浮点类型和复合类型)。​原子指的是一系列不可被CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核CPU下,当某个CPU核心开始运行原子操作时,会先暂停其它CPU内核对内存的操作,以保证原子操作不会被其它CPU内核所干扰。​。

f593256的博客 3146

嵌入式开发:用状态机实现STM32按键消抖,告别阻塞延时

在嵌入式系统开发中,处理异步事件和实时响应是核心挑战。状态机作为一种强大的编程模型,通过定义有限的状态、事件和状态转换规则,将复杂的、非线性的控制逻辑转化为清晰、确定且易于维护的代码结构。其技术价值在于实现逻辑的模块化、异步化和非阻塞化,能显著提升代码的可读性、可扩展性和系统实时性。这一思想广泛应用于协议解析、用户界面交互、传感器数据处理等场景。本文以嵌入式开发中基础的按键处理为例,针对传统“延时消抖”方法会阻塞主循环、影响实时性的痛点,深入讲解如何运用状态机思维重构按键消抖逻辑。通过分析状态机的核心三要素

weixin_33377602的博客 341

Java并发编程之原子变量

原子变量最主要的一个特点就是所有的操作都是原子的,synchronized关键字也可以做到对变量的原子操作。只是synchronized的成本相对较高,需要获取锁对象,释放锁对象,如果不能获取到锁,还需要阻塞在阻塞队列上进行等待。而如果单单只是为了解决对变量的原子操作,建议使用原子变量。关于原子变量的介绍,主要涉及以下内容: 原子变量的基本概念 通过AtomicInteger了解原子变...

weixin_30795127的博客 402

Cursor 详细使用

Cursor 是一款基于 VSCode 开发的 AI 驱动代码编辑器,集成 GPT-4、Claude3.5 等先进 LLM,具备代码补全、生成、解释、调试等功能,可提升开发效率和代码质量。3. 代码编辑:在编辑区编写代码,利用快捷键提升效率,如 Ctrl+Space 触发智能代码补全、Ctrl+K 润色或修改代码、Ctrl+L 智能问答与代码编辑。3. 代码解释:选中代码,按 Ctrl+L,输入如 “解释这段代码的功能”,Cursor 会给出详细解释。

坚持写博客,大家的关注是我前进的动力! 4818

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 835

原子变量

原子变量适用在共享资源是一个简单的整数值的情况下使用的 完整的锁机制对一个简单的整数来讲就有些浪费 数据定义 atomic_t v; 原子变量保存一个int值 但是不能记录大于24位的整数 使用的是ldrex和strex指令 适用于多核间的并发具体的API如下 void atomic_set(atomic_t *v, int i); atomic_t v = ATOMIC_INIT(

小白要学arm 3067

04目标检测-Two-stage的目标检测算法

前面我们对进行了对比分析,同时上一篇我们介绍了传统算法在目标检测的原理和效果,此篇我们记录了我学习目标检测算法的深度,深入讲述一下深度学习算法在目标检测的原理和效果。原文链接:https://blog.youkuaiyun.com/qq_41946216/article/details/132800752。版权声明:本文为优快云博主「爱吃面的猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。One-stage(YOLO和SSD系列):直接回归目标位置。

qq_41946216的博客 3654

什么是原子变量

在多线程程序中,多个线程可能会同时访问和修改同一个变量。例如,两个线程都想给一个计数器加1,如果没有妥善处理,就可能出现“丢失更新”的情况:两个线程都读取到相同的数值,然后都+1,最后就只有一个加了1,实际上应该加了2。原子变量就像“神奇的变量”,保证在多个线程同时操作时,每次操作都完整、不可被打断,就像是一只看得见的透明“锁”,不让其他操作干涉。原子变量确保在多线程环境下,每次读/写操作都是完整不可中断的,避免竞态条件。内容说明原子变量(Atomic)

2301_80355452的博客 904

手把手教你完成YOLOv11分类识别界面搭建,使用Qt6设计YOLOv11分类识别系统,前台系统+后台管理系统开发实战,全网最详细教程

本项目结合YOLOv11分类识别算法和PySide6框架,开发了一套图形化分类识别系统。系统支持图片、视频和摄像头实时分类检测,并具备完善的用户管理功能,包括登录验证、个人信息修改等模块。最新版本新增了管理员后台管理系统,包含用户管理、权限控制等功能。系统采用MySQL数据库存储用户数据,界面设计采用QtDesigner完成,实现了高效的目标分类与友好的交互体验。

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

Vue3 - 详细实现接入使用海康威视监控云端显示及控制功能,网站集成安装海康监控及实时监控显示、回放、放大缩小画面、视频画面截图、截屏抓拍、摄像头控制,实时推流及播放器解决延迟卡顿等问题(详细代码)

vue3,nuxt3,海康威视,海康监控,摄像头监控,实时监控画面,海康插件,视频播放,回放,视频流地址,取流协议,视频sdk播放,hik,rtsp,rtmp,hls,ws,网站,网页,h5页面,后台管理系统,vue3对接海康监控设备,无法连接,报错,vue3对接海康处理接口认证规则,监控实时预览和回放功能,海康api接口,安全认证,海康开放平台,官方文档,播放海康摄像头的监控视频,海康实时监控播放详细步骤,web,黑屏,特别卡不流畅怎么办,解决无法推流,录像,连接不上,vue3,海康,vue海康视频监控,

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

JUC-2. 原子变量与CAS算法

一 、 原子性 例子:i++的原子性问题:i++的操作实际上分为三个步骤 “读-改-写” int i = 10 ; i = i ++; //i为10 //分为三步 int tmp = 1; i = i + 1; i = tmp; /** * 原子性 * * @author xiaobin * @date 2018/3/3 */ public class TestAto...

xbliu564的博客 321

【雕爷学编程】Arduino动手做(111)---震动提醒模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

雕爷学编程 1898

2.JUC线程高级-原子变量与CAS算法

1.变量原子性引发的问题 这里我们通过一个很经典的案例i++来分析下原子性问题 int i = 10; i = i++; 此时i的值为:10 执行完i++后为什么结果是10,原因是因为i++操作,jvm底层实际是分为以下三步:(读-改-写) int temp = i; i = i + 1...

weixin_34250709的博客 158

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

JUC-原子变量和CAS算法

先写个测试demo,目的是引出CAS的作用! /** * @author TAO * @description: 原子变量-CAS算法 * @date 2020/9/21 20:53 */ public class TestAtomicDeme { public static void main(String[] args) { AtomicDemo ad=new AtomicDemo(); for (int i=0;i<10;i++){

程序员劝退师的博客 244

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入解析Java多线程与并发编程(四)(CAS原理以及JUC原子类)

本文介绍了CAS(Compare And Swap)原理及其在Java并发编程中的应用。CAS是一种CPU指令级的原子操作,用于实现无锁编程,通过比较并交换的方式保证对共享变量的修改是原子性的。Java中的JUC(java.util.concurrent)原子类依赖于sun.misc.Unsafe类的本地方法实现CAS操作。Unsafe类提供了底层的内存操作和CAS方法,允许直接访问系统内存资源。JUC原子类包括基本原子类(如AtomicInteger)、数组原子类(如AtomicIntegerArray)

wxchyy的博客 1083

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JUC多线程:Atomic原子类与CAS原理

tomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全。而 CAS 算法的具体实现方式在于 Unsafe 类中,Unsafe 类的所有方法都是 native 修饰的,也就是说所有方法都是直接调用操作系统底层资源进行执行相应任务。Atomic 使用乐观策略,每次操作时都假设没有冲突发生,并采用 volatile 配合 CAS 去修改内存中的变量,如果失败则重试,直到成功为止。

张维鹏的博客 9966

JAVA并发编程(2)——(如何保证原子性,原子类,CAS乐观锁,JUC常用类)

如原先的内存值为(A,1),线程将(A,1)修改为了(B,2),再由(B,2) 修改为(A,3)。此时另一个线程使用预期值(A,1)与内存值(A,3)进行 比较,,因为被 synchronized 修饰某段代码 后,无论是单核 CPU 还是多核 CPU,只有一个线程能够执行该代码,所以一 定能保证原子操作.但是不断的自旋,会导致 CPU 的消耗,在并发量大的 时候容易导致 CPU 跑满。当且仅当预期值 A==V,将内存值 V=B,否则什么都不做。②预估值 A (比较时,从内存中再次读到的值)

qq_53677566的博客 2533

【多线程与高并发 四】CAS、Unsafe 及 JUC 原子类详解

这系列文章讲述多线程及高并发详解,此文主要讲述CAS、Unsafe 及 JUC 原子类详解,包括CAS的操作过程及存在的问题、Unsafe类的介绍及典型应用,Atomic原子类

若明天不见 1907

Java JUC 高级线程之二 原子变量和CAS算法

文章目录原子变量CAS算法实例dome模拟CAS算法 原子变量 类的小工具包,支持在单个变量上解除锁的线程安全编程。事实上,此包中的类可将 volatile值、字段和数组元素的概念扩展到那些也提供原子条件更新操作的类。 类 AtomicBoolean、 AtomicInteger、 AtomicLong和 AtomicReference的实例各自提供对相应类型单个变量的访问和更新。每个类也为该类...

码农回顾 282

Java提高——JUC线程原子变量和CAS算法

原子变量类的小工具包,支持在单个变量上解除锁的线程安全编程。事实上,此包中的类可将volatile值,字段和数组元素的概念扩展到那些提供原子条件更新操作的类。类AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference的实例各自提供对相应类型单个变量的访问和更新。每个类也为该类型提供适当的实用工具方法。AtomicIntegerArray、Atom...

一颗洛米 304

Java高并发核心编程—CAS与JUC原子类

CAS原理JUC原子类一Atomic基本原子类数组原子类引用原子类字段更新原子类AtomicInteger 线程安全原理引用类型原子类属性更新原子类ABA问题提升高并发场景下CAS提作的性能以空间换时间: LongAdderCAS优势与弊端提升CAS性能JVM的synchronized轻量级锁使用CAS(Compare And Swap,比较并交换)进行自旋抢锁,并处于用户态下,所以JVM轻量级锁开销较小。

Cheney的博客 1071

JUC学习之原子变量与CAS算法

本文为看视频学习记录,若有错误,请指正,谢谢!首先介绍一下i++操作的原子性i++的操作实际上分成3个步骤“读-改-写”例如:Int i = 10;I = i++;实际上Int temp = i;I = i + 1;I = temp;看一段代码,表明在开发过程中原子性问题的表现:public class TestAtomicDemo { public static void main(St...

dyt443733328的博客 329

JUC线程高级(二)原子变量与CAS算法

import java.util.concurrent.atomic.AtomicInteger;/* * 一、i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” * int i = 10; * i = i++; //10 * * int temp = i; * i = i + 1; *...

轻描时光 440

【JUC】并发编程重点知识——CAS与Atomic原子类总结

CAS(Compare-And-Swap)是一种无锁编程的CPU原子指令,通过比较内存值与预期值实现线程安全操作。其底层采用lock cmpxchg指令保证原子性,具有无阻塞、高性能特点,但存在ABA问题和循环开销问题。Java中通过Atomic系列类(如AtomicInteger)实现CAS操作,包含原子引用、数组、更新器等扩展功能。相比synchronized悲观锁,CAS基于乐观锁思想,但需配合volatile保证可见性。为解决ABA问题,可使用AtomicStampedReference版本号机制。

gadiaola的博客 1119
上一篇: JUC_1-volatile 关键字 内存可见性
下一篇: JUC_3-ConcurrentHashMap 锁分段机制
YanQiu_Only
博客等级 码龄10年 6粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值