比较交换(CAS)

CAS相对于锁而言,有以下优点:

  • 由于其非阻塞性,它对死锁问题天生免疫
  • 线程间的相互影响更小
  • 更小的系统开销

CAS的缺点(重要)

要想理解CAS的缺点,请先理解下方的《CAS算法图解》。

对于只与算数有关的并发操作,CAS完全可以胜任。但是一旦并发操作与过程密切相关,那么可能CAS就不能很好胜任了。

举个例子,假设一家电商公司计划对账户余额小于20元的用户赠送20元来刺激用户消费。按时间顺序发生了以下过程:

  1. 线程1获取到用户A的余额为19
  • 线程2获取到用户A的余额为19
  • 线程1判断到用户A的余额符合条件,成功执行CAS(用户A, 19, 39);
  • 用户购买商品支付20元,余额变成19元
  • 线程2判断用户A的余额符合条件,执行CAS(用户A, 19, 39),并会成功执行!

若现实发生类似的这种情况,可能会造成无法估量的损失!

这种情况下,我们应该使用锁,或者带时间戳的CAS操作!带时间戳的CAS不仅仅进行值的比较,还对对象被操作的次数进行比较!而AtomicStampedReference类型就是提供时间戳的CAS操作

CAS算法图解

wusuo001.png