赞
踩
CAS 是compare and swap 的缩写, 即我们所说的比较交换。
CAS 是一种基于锁的操作, 而且是乐观锁。在java 中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后, 下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源, 比如通过给记录加version 来获取数据, 性能较悲观锁有很大的提高。
CAS 操作包含三个操作数—— 内存位置( V)、预期原值(A)和新值(B)。如果内存地址里面的值和A 的值是一样的,那么就将内存里面的值更新成B。CAS是通过无限循环来获取数据的,若果在第一轮循环中,a 线程获取地址里面的值被b 线程修改了, 那么a 线程需要自旋,到下次循环才有可能机会执行。
java.util.concurrent.atomic 包下的类大多是使用CAS 操作来实现的( AtomicInteger,AtomicBoolean,AtomicLong)。
1、CAS 容易造成ABA 问题
一个线程a 将数值改成了b,接着又改成了a,此时CAS 认为是没有变化, 其实是已经变化过了,而这个问题的解决方案可以使用版本号标识, 每操作一次version 加1。在java5 中,已经提供了AtomicStampedReference 来解决问题。
2、不能保证代码块的原子性
CAS 机制所保证的知识一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3 个变量共同进行原子性的更新, 就不得不使用synchronized 了。
3、CAS 造成CPU 利用率增加
之前说过了CAS 里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu资源会一直被占用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。