比较交换(CAS)
CAS相对于锁而言,有以下优点:
- 由于其非阻塞性,它对死锁问题天生免疫
- 线程间的相互影响更小
- 更小的系统开销
CAS的缺点(重要)
要想理解CAS的缺点,请先理解下方的《CAS算法图解》。
对于只与算数有关的并发操作,CAS完全可以胜任。但是一旦并发操作与过程密切相关,那么可能CAS就不能很好胜任了。
举个例子,假设一家电商公司计划对账户余额小于20元的用户赠送20元来刺激用户消费。按时间顺序发生了以下过程:
- 线程1获取到用户A的余额为19
- 线程2获取到用户A的余额为19
- 线程1判断到用户A的余额符合条件,成功执行CAS(用户A, 19, 39);
- 用户购买商品支付20元,余额变成19元
- 线程2判断用户A的余额符合条件,执行CAS(用户A, 19, 39),并会成功执行!
若现实发生类似的这种情况,可能会造成无法估量的损失!
这种情况下,我们应该使用锁,或者带时间戳的CAS操作!带时间戳的CAS不仅仅进行值的比较,还对对象被操作的次数进行比较!而AtomicStampedReference类型就是提供时间戳的CAS操作