码迷,mamicode.com
首页 > 编程语言 > 详细

CAS算法

时间:2019-09-03 22:39:46      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:技术   比较   image   http   最新   inf   cas   地址   这一   

前言

CAS,即 Compare And Swap(比较与交换),是一种无锁算法,基于硬件原语实现,能够在不使用锁的情况下实现多线程之间的变量同步。jdk中的java.util.concurrent.atomic包中的原子类就是通过CAS来实现了乐观锁。

CAS算法过程

算法涉及到三个操作数:

  • 需要读写的内存位置V
  • 需要进行比较的预期值A
  • 需要写入的新值U

CAS算法解析:

CAS具体执行时,当且仅当预期值A符合内存地址V中存储的值时,就用新值U替换掉旧值,并写入到内存地址V中。否则不做更新。

CAS算法的运行原理如下如所示:

技术图片

CAS会有如下三个方面的问题:

1.ABA问题,一个线程将内存值从A改为B,另一个线程又从B改回到A。

2.循环时间长开销大:CAS算法需要不断地自旋来读取最新的内存值,长时间读取不到就会造成不必要的CPU开销。

  1. 只能保证一个共享变量的原子操作(jdk的AtomicReference来保证应用对象之间的原子性,可以把多个变量放在一个对象里来进行CAS操作,解决了这一问题)。

ABA问题图解:

技术图片

ABA问题解决方案:在变量前面添加版本号,每次变量更新的时候都将版本号加1,比如juc的原子包中的AtomicStampedReference类。

CAS算法

标签:技术   比较   image   http   最新   inf   cas   地址   这一   

原文地址:https://www.cnblogs.com/wildwolf0/p/11455796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!