Java并发编程- CAS原理

Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理) 四、共享模型之内存 五、共享模型之无锁 六、共享模型之不可变 阅读详情

Java并发编程- CAS原理

例子:

/**
 * CAS原理
 * @author wufei
 * @create 2019-07-23 19:03
 **/
public class CAS1 {

    private static  volatile  int m =0;

    //原子性的保证
    private static AtomicInteger atomicInteger = new AtomicInteger(0);

    private static void incress1(){
        m ++;
    }
    private static void incress2(){
        atomicInteger.incrementAndGet();
    }
    public static void main(String[] args) throws InterruptedException{

        Thread[] th1 = new Thread[20];

        for (int i = 0; i < 20; i++) {
            th1[i] = new Thread(new Runnable() {
                public void run() {
                    CAS1.incress1();
                }
            });
            th1[i].start();
            th1[i].join();
        }


        Thread[] th2 = new Thread[20];
        for (int i = 0; i < 20; i++) {
            th2[i] =new Thread(new Runnable() {
                public void run() {
                    CAS1.incress2();
                }
            });
            th2[i].start();
            th2[i].join();
        }
        System.out.println("m: "+m);
        System.out.println("atomicInteger: "+atomicInteger.get());

    }
}

运行都是输出20 20 

反编译:

javap -v  CAS1.class

javap -c  CAS1.class

我们查看的只需要incress1()和incress2()

从编译的class文件可以看出:ingress1方法的m++执行了三个指令,

ingress2方法的atomicInteger.incrementAndGet();执行了一个指令,说明了atomicInteger.incrementAndGet()效率高于m++;

我们来看下atomicInteger.incrementAndGet()源码来分析底层原理:

使用的是sun.misc包下的Unsafe类。

调用的方法getAndAddInt()

参数:var1: 要修改的值

var2: 期望值

var4: 更新的值

意思是要修改的值和期望值对比,如果一样则更新值,否则不更新。

原理过程: 原子性AtomicInteger.

incrementAndGet()方法,通过Unsafe类vm去调用unsafe.cpp--汇编。(需要硬件支持)

 

 

例子2:

线程1 把100 修改了110

线程2 把110修改了100

线程3 把100修改了120

出现了ABA的问题

public class CAS2 {

   static AtomicInteger atomicInteger = new AtomicInteger(100);

    public static void main(String[] args) {

        Thread t1 = new Thread(new Runnable() {
            public void run() {
                System.out.println(atomicInteger.compareAndSet(100, 110));
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(atomicInteger.compareAndSet(110, 100));
            }
        });
        t2.start();

        Thread t3 = new Thread(new Runnable() {
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(atomicInteger.compareAndSet(100, 120));
            }
        });
        t3.start();
    }
}

输出结果:都修改成功了,其实应该t1和t2成功,t3是更新失败的。

 

怎样解决ABA的问题呢?

使用AtomicStampedReference类,使用了版本号来控制

public class CAS3 {
//初始化asr,然后设置了版本号为0
   static AtomicStampedReference asr = new AtomicStampedReference(100,0);
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                System.out.println(asr.compareAndSet(100, 110, asr.getStamp(), asr.getStamp() + 1));
                System.out.println(asr.compareAndSet(110, 100, asr.getStamp(), asr.getStamp() + 1));
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            public void run() {
             int  st =   asr.getStamp();//获取版本号
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(asr.compareAndSet(110, 100, st, st+ 1));

            }
        });
        t2.start();
    }
}

运行结果:

 

CAS的使用场景:

1.应用于简单的数据计算

2.适合线程冲突少的场景

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

从 CAS 到 AQS:Java 并发编程的锁机制演进全解析,一文搞懂底层原理! Java并发编程的核心技术演进:从CAS到锁优化 本文探讨了Java并发编程中的关键技术演进路径。首先介绍了CAS(比较并交换)这一硬件级原子操作原理,它通过比较预期值和实际值实现无锁编程。Java通过Unsafe类实现CAS,但存在ABA问题和自旋开销。基于CAS开发了自旋锁,采用忙等待策略减少上下文切换,并通过自适应机制优化自旋次数。进一步分析了Java并发框架从CAS到synchronized锁升级,再到AQS框架的技术演进,展现了如何在保证线程安全的同时提升性能。这些底层机制共同构成了Java高效 阅读详情

相关推荐

Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

Projectsauron 的博客 7万+

并发编程——CAS

首先看一个案例:我们开发一个网站,需要对访问量进行统计,用户每发送一次请求,访问量+1,如何实现?我们模拟有100个人同时访问,并且每个人对网站发起10次请求,最后总访问次数应该是1000次。// 总访问量 static int count = 0;// 模拟访问的方法 public static void request() throws InterruptedException {// 模拟耗时5毫秒 TimeUnit . MILLISECONDS . sleep(5);count ++;

eyes++的博客 778

Win10 Rational Rose 安装教程

在此教程中我们需要四个文件,点此下载[提取码:ig33] 其中第一个为2007的安装包,第二个为破解文件 前言 很多小伙伴反应说会出现几天后就到期的问题,包括我也出现了该问题,如果你已在其他地方安装好了文件且破解成功,且但几天后到期,如果可以使用更改时间的方式打开,那么可以跳过接下来的教程,直接看第三节,我们采用批处理的形式一键完成从修改时间到打开最后改回来的方法解决此问题 一、安装软件 解压缩两个安装包,进入 Rational Rose文件夹 选择setup.exe开始安装 按照图示依次点击

CoderJiang 2万+

并发编程-CAS介绍(结合源码和hostpot说明)

CAS全称 Compare And Swap(比较与交换),是一种无锁算法,是线程并发运行时用到的一种技术。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。在学习并发编程的时候,CAS乐观锁是不可获取的内容,它的优点在于竞争资源的过程没有阻塞线程,是一种无锁化设计,不涉及操作系统用户模式和内核模式的转换,但是它的缺点也很明显,比如自旋问题,ABA问题、还有它本身的局限性。今天我们就系统的来看下这个CAS乐观锁。

qq_25409421的博客 1725

计算机等级考试(二级WPS)---真题14套

目录 真题14一、选择题二、WPS文字三、WPS表格四、WPS演示21.打开考生文件夹下的素材文档 “WPS.docx”(.docx 为文件扩展名),后续操作均基于此文件,否则不得分。小周正在整理一份关于极光的文档,请按要求帮助她完成文档的排版工作。1.将全文中的手动换行符全部替换为中文句号并回车,删除文中的空行和空格。2.将正文第 2 段(“在我國的古書…… 極光”)中的繁体字转换成简体字,并为其设置 “正文” 样式。3.对文档样式进行如下设置:4.为 “1.3 极光的形态” 一节中列出的五种极光形态特征

2401_82750246的博客 1183

并发编程07:CAS

并发编程07:CAS

m0_66689823的博客 487

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9930

【并发编程】CAS到底是什么

CAS是Compare-And-Swap(比较并交换)的缩写,是一种轻量级的同步机制,主要用于实现多线程环境下的无锁算法和数据结构,保证了并发安全性。它可以在不使用锁(如synchronized、Lock)的情况下,对共享数据进行线程安全的操作。

陈宝子的博客 9270

微信公众平台 - 微信内置浏览器 WeixinJSBridge.invoke(‘xxx‘) API 报错:system:access_denied(常见于微信支付、分享朋友圈/转发好友等功能)解决方案

微信支付提示System:access_denied,调用微信支付返回:system:access_denied为什么,安卓版微信支付偶尔出现system:access_denied,微信公众号开发分享出现system:access_denied,system:access_denied如何解决?微信WeixinJSBridge.invoke(‘xxx‘)API调用后出现报错,微信内部H5WeixinJSBridge.invokesystem:access_denied,使用微信jssdk时报ac

🏆 前端领域优质创作者 5146

MATLAB计算各种复合干热指数,如SDHI、DHMI等

MATLAB编程实现各种复合干热指数

WW、forever的博客 5082

并发编程之深入理解CAS

CAS 和加锁相比,CAS 更加轻量,但也带来了两个问题一个是ABA问题、一个是自旋时间问题。

Huangjiazhen711的博客 499

8、水力压裂引起的地质材料力学性质变化的可视化研究

本研究探讨了水力压裂引起的地质材料力学性质变化的可视化方法。利用超声剪切波形数据,通过短时傅里叶变换(STFT)和主成分分析(PCA)进行特征提取和降维,并应用K-means聚类、凝聚聚类和DBSCAN等无监督学习方法对地质力学变化进行非侵入式可视化分析。研究比较了不同特征工程、聚类方法和降维策略对可视化效果的影响,并结合位移不连续性理论为聚类结果分配地质力学变化指数,以提高结果的物理解释性。最终,该方法成功实现了对水力压裂引起的岩石力学性质变化的高效、可靠可视化。

emacs5lisp的博客 110

JAVA并发编程JUC包 之 “CAS原理”

JAVA并发编程JUC包 之 “CAS原理”

jcc4261的博客 832

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

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

java cas 原理_并发编程之 CAS 的原理

前言在并发编程中,锁是消耗性能的操作,同一时间只能有一个线程进入同步块修改变量的值,比如下面的代码synchronized void function(int b){a = a + b;}复制代码如果不加 synchronized 的话,多线程修改 a 的值就会导致结果不正确,出现线程安全问题。但锁又是要给耗费性能的操作。不论是拿锁,解锁,还是等待锁,阻塞,都是非常耗费性能的。那么能不能不加锁呢?...

weixin_39953845的博客 112

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Java并发编程】描述常见的锁策略、CAS在Java中的实现以及 Synchronized 的加锁原理

描述常见的锁策略、描述CAS的原理以及在Java中有哪些实现、描述Java中 synchronized的基本特点和加锁原理。

yican2580的博客 2079

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JAVA并发编程JUC包之CAS原理

通过分析原子类CAS源码,通俗易懂解刨原理,以及用示例代码演示ABA问题

拉丁解牛技术专栏 1115

Java并发编程:深入解析原子操作类与CAS原理

Java并发包(java.util.concurrent.atomic)提供了一系列原子操作类,这些类通过无锁算法实现了线程安全的操作,相比传统的锁机制具有更高的性能。原子类基于CAS(Compare-And-Swap)指令实现,是现代并发编程的重要基础。原子类主要分类基本类型引用类型数组类型字段更新器累加器累加器增强Java原子操作类是基于CAS实现的高性能线程安全工具,理解其原理和适用场景对于编写高效并发程序至关重要。在实际开发中,应根据具体场景选择合适的原子类,并注意其内存语义和潜在问题。

hi星尘的博客 957

Java并发编程(三)—CAS的原理及应用场景

CAS通过比较并交换的方式来更新共享变量,避免了使用传统锁机制带来的性能开销,但在高并发场景下可能会遇到自旋消耗CPU资源和ABA问题等。

echola_mendes的博客 2369

Java 并发编程核心:CAS 原理

很多同学疑惑:比较 + 交换明明是两步,为什么不会被其他线程打断?CAS 不是 Java 代码实现,而是 CPU 硬件级别的单条原子指令。单条指令执行过程不可分割、不可中断,要么全部完成,要么完全不执行,从硬件层面保证了原子性。CAS = 比较并交换,无锁、轻量、基于 CPU 原子指令;三参数:V(当前值)、A(预期值)、B(新值);流程:读取 → 计算 → 比较交换 → 失败自旋;Java 中使用 Atomic 原子类快速实现 CAS;

2403_89732016的博客 555

11、java并发编程中一个著名的问题CAS原理分析

学习Java并发编程,CAS机制都是一个不得不掌握的知识点。这篇文章主要是从出现的原因再到原理进行一个解析。希望对你有所帮助。 一、为什么需要CAS机制? 为什么需要CAS机制呢?我们先从一个错误现象谈起。我们经常使用volatile关键字修饰某一个变量,表明这个变量是全局共享的一个变量,同时具有了可见性和有序性。但是却没有原子性。比如说一个常见的操作a++。这个操作其实可以细分成三个步骤: (1...

冯冬冬的博客 486

Java并发编程中的CAS原理及AQS(AbstractQueuedSynchronizer)的工作原理

CAS的基本思想是由CPU提供的原子指令,可以保证对内存中的值进行原子操作,避免了使用锁的开销。AQS在实现同步器时,可以通过重写一些方法来控制线程的排队和阻塞CAS(Compare and Swap,比较并交换)是一种并发编程中常用的原子操作。它是一种乐观锁的实现方式,用于实现非阻塞算法。CAS原理是通过比较内存中的值与预期值,如果相等则将新值写入内存,否则不做任何操作。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 558

面试官:说说 Java 并发编程中 CAS 以及 AQS 的实现原理?

CAS(),即比较并交换,是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS 操作包含三个操作数——内存位置V、预期原值A和新值B。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值;否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。CAS 有效地说明了“我认为位置V应该包含值A,如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”在 Java 中,类提供了硬件级别的原子操作来实现这个 CAS,

m0_50180963的博客 649

从 JMM 到 CAS:拆解 Java 并发编程的内存规范与原子操作原理

摘要:本文解析Java并发编程的两大核心技术:JMM(Java内存模型)规定了多线程下共享内存的访问规范,通过主内存和工作内存的交互保证线程安全;CAS(比较并交换)则利用硬件原子指令实现无锁并发,应用于AtomicInteger等原子类,具有无锁开销小、粒度细的优点,但也面临ABA问题、自旋开销等局限。两者共同构成了Java高效并发编程的基础,开发者需根据场景灵活选用。

学习和分享计算机相关知识,希望可以帮助到您 1014

【Java 并发编程】CAS 原理解析

悲观锁的原理是每次实现数据库的增删改的时候都进⾏阻塞,防⽌数据发⽣脏读。乐观锁的原理是在数据库更新的时候,⽤⼀个 version 字段来记录版本号,然后通过⽐较是不是⾃⼰要修改的版本号再进⾏修改。这其中就引出了⼀种⽐较交换的思路来实现数据的⼀致性,事实上,CAS 也是基于这样的原理。

迪曼奥特迦-博客 1560

Java并发编程-CAS原理

CAS 自旋锁 ABA

m0_46561911的博客 1113
上一篇: Java并发编程- Synchronized原理
下一篇: Java并发编程- AQS原理
wflovejava
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值