原子操作CAS

作者: 冰封陈韶 | 来源:发表于2020-06-08 15:12 被阅读0次

什么是原子操作?

原子操作就是操作A,在B看来要么全部成功,要么全部失败,就称A为原子操作;有点类似事物,锁也是一种原子操作。

CAS操作是怎么实现原子的呢?

CAS操作的核心是操作系统和CPU提供的,不在语言层面。底层方法是(内存地址,一个旧值,一个新值),操作系统根据内存地址拿到数据,和原来的旧值比较,如果相等,就将新值替换掉旧值。我们使用CAS操作来实现原子操作,可以不使用锁,简称无锁化编程,也叫乐观锁。相对于乐观锁,就有悲观锁,悲观锁常见的就是synchronized,可以理解为 总有刁民想害朕;而乐观锁 底层使用CAS机制,先拿到旧值,然后获取新值,再进过CAS操作,如果成功,就退出,如果不成功,就一直循环,直到成功为止;
乐观锁的好处:无锁化编程,提升并发量,没有死锁等问题;
乐观锁的坏处:ABA问题,循环开销问题,只能对一个共享变量进行操作

什么是ABA问题?

严格来说,ABA不算是一个问题;因为不需要关心中间状态,但是也是有一点问题;例如:如果A线程正在执行某一操作,拿到旧值a,获得新值b的时候,B线程快速的将a变成了c,然后又改成了a,对于A线程来说,旧值相等,执行CAS操作。

如何解决ABA问题?

添加一个版本控制,线程在更新成功的时候,需要将版本号+1,那么A在进行比较的时候,不仅需要比较旧值和新值,还需要比较版本号,可以有效避免ABA问题。

循环开销问题
因为线程是自旋(死循环),所以如果一直不成功,开销有点大

只能对一个共享变量操作
如果有多个变量,将它们合并起来,组成对象来操作。

JAVA提供了一些原子操作类
AtomicInteger:针对int类型的
AtomicIntegerArray:针对int数组的
AtomicReference:针对引用类型的数据
AtomicStampReference:针对引用类型的数据,可以解决ABA问题,它可以记录版本号
AtomicMarkableReference:针对引用类型的数据,可以解决ABA问题,它记录数据有没有被改过。

我们虽然使用了CAS原子操作,但是还需要将变量用volatile修饰,保持它的可见性,才可以实现乐观锁。

相关文章

  • java如何实现原子操作CAS

    在Java中可以通过锁和循环CAS的方式来实现原子操作。 使用循环CAS实现原子操作 JVM中的CAS操作正是利用...

  • CAS+ABA+Unsafe+悲观锁和乐观锁

    1 CAS CAS,即compare and swap。CAS操作是原子操作,在多线程中执行CAS操作可以实现同步...

  • 多线程笔记4-CAS基本原理

    什么是CAS? CAS为 compare and swap (判断并且交换) 什么是原子操作? 原子操作的基本概念...

  • java多线程(三)原子操作CAS

    CAS(Compare And Swap)什么是原子操作?如何实现原子操作CAS的原理:利用了现代处理器都支持的C...

  • Java基础-线程 (三)-锁

    CAS是什么? 了解CAS之前,我们先了解变量的2大特性。 原子操作(原子性):对于操作A,要么执行完,要么完全不...

  • Java-多线程-Atomic&Unsafe魔术类

    一、原子操作 Java中可以通过锁和循环CAS的方式来实现原子操作。JVM中的CAS操作正是利用了上文中提到的处理...

  • 笔记:多线程并发编程(2)CAS 、阻塞队列、线程池

    CAS (Compare and swap )原子性操作(乐观锁) CAS 是使用现代cpu的cas 指令实现的原...

  • 原子操作CAS

    原子 原子:Atomic,原子的,不可分隔的最小单位 Java基于阻塞的内置锁Synchronized的缺点 阻塞...

  • 原子操作CAS

    Atom不可分割的意思,CAS是一种替换操作,不是锁。 一、原子操作 1.1sync的缺点 基于阻塞机制 被阻塞的...

  • CAS原子操作

    如果面试官问你CAS的理解,首先要确定是他问的是“原子操作”还是“单点登录”。因为在企业应用中CAS也被称为企业级...

网友评论

    本文标题:原子操作CAS

    本文链接:https://www.haomeiwen.com/subject/tlqrtktx.html