CAS 原理以及ABA问题

Java面试题

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类来实现的。

你可能感兴趣的:(Java面试题,java,开发语言)