【Java多线程】 CAS —— 一文了解CAS到底是什么

CAS(Compare and Swap)是Java并发包中用于保证原子性的一种机制,它通过硬件支持实现原子操作,避免了线程阻塞。本文介绍了CAS的概念、为何需要CAS、其工作原理、应用场景以及存在的ABA问题及其解决方案。
摘要由CSDN通过智能技术生成

学过多线程就会接触到并发,并发再多线程中的重要性不言而喻,在Java中还有并发包,里面实现了各种各样的方法来帮助我们解决多线程带来的各种问题。而要想读懂这些底层问题,CAS是绕不过的知识,大多底层都是以CAS来实现的。今天就带大家来学习CAS相关的知识。

一、什么是CAS?

CAS: 全称Compare and swap,字面意思:" 比较并交换 "
一个CAS涉及到的操作数有:

  • 内存值V
  • 旧的预期值A
  • 要修改的新值B

有了这三个操作数,在看看它的操作:

  1. 首先输入旧的预期值A 和修改后的新值 B
  2. 对比变量是旧值和内存值是否相同
  3. 如果相同,将旧值改为新值

这也就侧面的表现出了对于多个线程都对某个值进行修改时,保证了修改前拿到的值是期望值才会操作。

二、为什么要有CAS

还记得之前多线程的经典例子嘛,就是多个线程同时对一个共享变量进行修改值,最终修改后的值大概率不是正确的结果。也就是对于i ++ 操作,在多线程中是保证不了它的正确性。
原因呢,就是i ++ 本身并不是一个原子性的操作,它可以分成三步:

  1. 从主内存中读取到 i 的值
  2. 对 i 进行+1 操作
  3. 写回到主内存

这就导致多线程在执行该操作时,线程A、B可能同时从主内存中获得一个值后分别 +1 后写回到主内存。导致结果的错误,这时候你就会想到 那用 呗! 所以解决的方式就是使用synchronized关键字来进行加锁。
的确,这种多线程导致的原子性问题可以加锁,使得众多线程竞争锁,拿到锁的线程才可以进行下一步的操作,其它线程则都开始阻塞,直到这个线程释放了锁后,唤醒其它线程,再次开始竞争锁。
对于线程的阻塞和唤醒都是非常消耗时间的! 如果像i ++ 的操作,仅仅只是每次进行加一操作就要经历线程唤醒和重新竞争锁

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值