CAS关键字
CAS介绍
CAS是compareAndSwap(比较并交换),它有三个操作数,分别是内存地址V,旧的预期值A,新的值B,CAS执行时,当且仅当V的值符合旧预期值A时,处理器就更新V的值为B,否则就不进行更新。无论它是否更新V的值,都会返回V的旧值,这是个原子操作。
CAS实现了无锁状态下的共享变量的非原子操作问题。这是基于处理器的机制,在Java中在sun.misc.Unsafe类中的compareAndSwapInt()和compareAndSwapLong等几个方法包装提供。
Unsafe类不是提供给用户调用的类,设置不是启动类加载器加载的class无法访问它,除了利用反射,就是在JUC包下的整数原子类如AtomicInteger的compareAndSet和getAndIncrement()方法都使用了Unsafe类的CAS操作。
CAS的ABA问题
一个变量初始值为A,准备赋值时检测为A,这时候可能这个变量曾经改成了B,然后又被改回了A。这样虽然旧值没改变,但是实际上已经改变了。
JUC提供了AtomicStampedReference来解决这个问题,给变量加上版本号。
CAS的缺陷
一般使用CAS时,处理器会循环一直执行CAS操作,如果一直不执行成功,就一直等待下去。在很多线程同时想更新一个变量时,CAS会给CPU带来很大的压力。这时候使用传统的同步比较好。