CAS (Compare And Swap)

CAS (Compare And Swap)

(compare and swap, CAS),是原子操作的一种。整个AQS同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JUC的基石。
201703090001

在使用上,CAS涉及到三个值:旧值 预期值 要设置的新值
通常会记录下某块内存中的旧值,通过对旧值进行一系列的操作后得到新值,然后通过CAS操作将新值与旧值进行交换。如果这块内存的值在这期间内没被修改过,则旧值会与内存中的数据相同,这时CAS操作将会成功执行使内存中的数据变为新值。如果内存中的值在这期间内被修改过,则一般来说旧值会与内存中的数据不同,这时CAS操作将会失败,新值将不会被写入内存。

应用

在应用中CAS可以用于实现无锁数据结构,常见的有无锁队列(先入先出)以及无锁堆(先入后出)。对于可在任意位置插入数据的链表以及双向链表,实现无锁操作的难度较大。

ABA问题

ABA问题是无锁结构实现中常见的一种问题,可基本表述为:

  1. 进程P1读取了一个数值A
  2. P1被挂起(时间片耗尽、中断等),进程P2开始执行
  3. P2修改数值A为数值B,然后又修改回A
  4. P1被唤醒,比较后发现数值A没有变化,程序继续执行。
    对于P1来说,数值A未发生过改变,但实际上A已经被变化过了,继续使用可能会出现问题。
    解决方法:
    对于ABA问题其解决方案是加上版本号,即在每个变量都加上一个版本号。

参考资料:
https://zh.wikipedia.org/wiki/%E6%AF%94%E8%BE%83%E5%B9%B6%E4%BA%A4%E6%8D%A2
http://cmsblogs.com/?p=2235

posted @ 2018-09-25 20:04  一把水果刀  阅读(273)  评论(0编辑  收藏  举报