参考答案
1. CAS的概念
前往查看:什么是CAS
2. 关于CAS操作
- 如果这个地址上的值和期望的值相等,则给其赋予新值,否则不做任何事儿,但是要返回原值是多少。
- 每一个CAS操作过程都包含三个运算符:一个内存地址V,一个期望的值A和一个新值B,操作时,如果这个地址上存放的值等于这个期望的值A,则将地址上的值赋为新值B,否则不做任何操作。
3. CAS的缺点
3.1 ABA问题
例如:一个线程one从内存位置V中取出A,同时另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这个时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但可能存在潜藏的问题。
从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。
3.2 循环时间长开销大
对于资源竞争严重(线程冲突严重)的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized。
3.3 只能保证一个共享变量的原子操作
当对一个共享变量执行操作时,可使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS无法保证操作的原子性,这个时候可以用锁。
4. CAS的优点
- cas是一种乐观锁,而且是一种非阻塞的轻量级的乐观锁。
- 非阻塞式其实就是一个线程想要获得锁,对方会给一个回应表示这个锁能不能获得。
- 在资源竞争不激烈的情况下性能高,相比synchronized重量锁,synchronized会进行比较复杂的加锁,解锁和唤醒操作。
5. CAS的底层原理
前往查看:CAS的底层原理是什么
以上,是Java面试题【CAS有什么优点、缺点】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—