CAS 原理
CAS 全称是Compare and Swap,比较再交换。比较内存中某个值是否和预期值相同,如果相同则将这个值更新为新值,不相同则不更新。
CAS锁-乐观锁
CAS自旋锁,属于乐观锁。 通过do-while循环,当通过CAS更新值成功时,跳出循环,否则一直循环尝试更新直到成功。
CAS缺点
1自旋时间长,浪费cpu资源。
出现锁竞争时,等待线程会一直通过自旋来竞争锁,浪费了cpu资源。
2.只能保证一个变量的原子操作。
CAS只能针对一个共享变量使用,如果多个变量都需要保证原子操作,就只能使用锁。
3.ABA问题。
内存中的值由A变成B,然后又变回A后,当CAS检查时,无法发现是否被修改过。
ABA问题解决方法:版本号控制,判断版本是否一致,每次修改版本都+1.
CAS的应用
AtomicXXX开头的原子类,保证了多线程环境下共享变量的原子操作。原子类中的CAS是通过Unsafe类来实现的。