CAS乐观锁

什么是CAS

  1. CAS比较并替换,是一种并发编程中用到的一种技术。
  2. CAS是原子性,保证并发安全,而不是保证并发同步
  3. CAS是CPU的一个指令
  4. CAS是非阻塞的、轻量级的乐观锁

为什么说CAS是乐观锁

乐观锁,严格来说并不是锁,通过原子性来保证数据的同步,比如说数据库的乐观锁,通过版本控制来实现等,所以CAS不会保证线程同步。乐观的认为在数据更新期间没有其他线程影响

synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。

CAS原理

CAS(compare and swap) 比较并替换,就是将内存值更新为需要的值,但是有个条件,内存值必须与期望值相同。举个例子,期望值 E、内存值M、更新值U,当E == M的时候将M更新为U。

例子:

1.在内存地址V当中,存储着值为10的变量。

image.png

2.此时线程1想要把变量的值增加1。对线程1来说,旧的预期值A=10,要修改的新值B=11。

image.png
  1. 在线程1要提交更新之前,另一个线程2抢先一步,把内存地址V中的变量值率先更新成了11。
image.png
  1. 线程1开始提交更新,首先进行A和地址V的实际值比较(Compare),发现A不等于V的实际值,提交失败。
image.png
  1. 线程1重新获取内存地址V的当前值,并重新计算想要修改的新值。此时对线程1来说,A=11,B=12。这个重新尝试的过程被称为自旋。
image.png
  1. 这一次比较幸运,没有其他线程改变地址V的值。线程1进行Compare,发现A和地址V的实际值是相等的。


    image.png

7.线程1进行SWAP,把地址V的值替换为B,也就是12。

image.png

CAS优缺点

  • 优点
    非阻塞的轻量级的乐观锁,通过CPU指令实现,在资源竞争不激烈的情况下性能高,相比synchronized重量锁,synchronized会进行比较复杂的加锁,解锁和唤醒操作。
  • 缺点
    (1)ABA问题
    线程C、D,线程D将A修改为B后又修改为A,此时C线程以为A没有改变过,java的原子类AtomicStampedReference,通过控制变量值的版本来保证CAS的正确性。
    (2)自旋时间过长,消耗CPU资源,
    如果资源竞争激烈,多线程自旋长时间消耗资源。

底层实现

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是悲观锁、乐观锁? synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观...
    爱情小傻蛋阅读 571评论 0 3
  • 深入理解CAS(乐观锁) java使用CAS之前 在JDK5之前Java语言是靠synchronized关键字保证...
    瓶子里的王国阅读 33,371评论 0 26
  • 本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理...
    AubreyXue阅读 145,962评论 16 176
  • 本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理...
    氨基钠阅读 148评论 0 1
  • 1. 乐观锁和悲观锁 悲观锁 总是假设最坏的情况,为防止每次去拿数据别人修改,每次在拿数据的时候都会上锁,这样别人...
    CarsonCao阅读 667评论 0 0