CAS概念
CAS的全称是:比较并交换(Compare And Swap)。在CAS中,有这样三个值:
- V:要更新的变量(var)
- E:预期值(expected)
- N:新值(new)
比较并交换的过程如下:
判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程更新了V,则当前线程放弃更新,什么都不做。
Unsafe类
Java提供的native CAS操作类
原子数据类型
即java.util.concurrent.atomic包下
CAS三大问题
ABA问题
一个值原来是A,变成了B,又变回了A。这个时候使用CAS是检查不出变化的,但实际上却被更新了两次。
解决方法是加上版本号或时间戳的验证。Java提供AtomicStampedReference类来解决ABA问题,其原理就是判断时间戳
循环时间长开销大
CAS通常使用自旋,如果自旋不成功会大量占用CPU资源。
解决思路是让JVM支持处理器pause指令;
pause指令能让自旋失败时CPU暂停一小段时间再继续自旋,从而使读操作频率降低
只能保证一个共享变量的原子操作
- 使用JDK 1.5开始就提供的AtomicReference类保证对象之间的原子性,把多个变量放到一个对象里面进行CAS操作;
- 使用锁。锁内的临界区代码可以保证只有当前线程能操作。
