概念
全称:Compare and Swap 比较交换
原理
存在三个变量,一个变量是内存的值,另一个变量是预期值,还有一个变量是修改后的值
当一个线程需要修改数据时,首先会从内存中读取数据的值赋值给预期值,然后修改时会比较预期值和内存的值是否相等,如果相等,则修改,否则不修改重复上述操作
存在问题
ABA问题,一个线程把数据从A改变到B,然后又从B改变到A,值虽然不变,但是存在两次动作
并发越高,失败的次数会越多,CAS如果长时间不成功,会极大的增加CPU的开销。因此CAS不适合竞争十分频繁的场景。
只能保证一个共享变量的原子操作。当对多个共享变量操作时,CAS就无法保证操作的原子性。
解决方案
添加一个参数记录版本,每修改一次,版本号加1
Java1.5开始JDK提供了AtomicReference类来保证引用对象的原子性,可以把多个变量放在一个对象里来进行CAS操作。
引申Java知识点
Java1.5的Atomic包名为java.util.concurrent.atomic。这个包提供了一系列原子类,包含:
AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference
AtomicIntegerArray,AtomicLongArray
AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray
总结
cas是一种乐观锁,其在硬件层面保证了比较并交换操作的原子性,处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。