【锁】CAS(Compare And Swap)

【锁】CAS(Compare And Swap)

  • 前言
  • ⭐️ Compare And Set
  • 缺陷


前言

【锁】悲观锁与乐观锁实现,中乐观锁,使用的是CAS算法。

CAS 的含义是“我认为原有的值应该是什么,如果是,则将原有的值更新为新值,否则不做修改,并告诉我这个值现在是多少”。—《Java并发编程实践》


⭐️ Compare And Set

CAS(Compare And Set 或 Compare And Swap),即比较并修改的意思。CAS技术可以保证操作的原子性,atomic包下的原子类都是基于CAS和volatile实现原子操作的。
【Atomic】—JDK 原子计数器AtomicInteger(源码)对java 使用CAS源码进行了分析,

【锁】CAS(Compare And Swap)_第1张图片

缺陷

  • ABA问题。

因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A。

从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

  • 循环时间长开销大

循环时间长开销大。自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。

  • 只能保证一个共享变量的原子操作

当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。

你可能感兴趣的:(基础总结,锁,java,jvm,面试)