CAS会产生哪些问题呢?
下文笔者讲述CAS可能会引发问题的简介说明,如下所示
CAS可能引发的问题: ABA问题、循环时间长开销大问题、循环变量只能保证一个共享变量的原子操作
ABA问题
如: 线程1从内存位置 V 中取出 A 此时另一个线程 2 也从内存中取出 A,且线程 2 进行了一些操作变成了 B,然后线程 2 又将 V 位置的数据变成 A 这时候线程 1 进行 CAS 操作发现内存中仍然是 A,然后线程 1 操作成功 此时虽然“线程1”CAS 操作成功 但可能存在潜藏问题 注意事项: 从Java1.5开始JDK的atomic包里提供了一个类 AtomicStampedReference来解决ABA问题
循环时间长开销大
对于资源竞争严重(线程冲突严重)情况 CAS自旋的概率会比较大 从而浪费更多CPU资源,效率低于synchronized
CAS只能保证一个共享变量原子操作
对一个共享变量执行操作时 我们可以使用循环CAS方式来保证原子操作 但是对多个共享变量操作时 循环CAS无法保证操作的原子性 此时我们只能采用加锁的方式处理CAS产生的问题
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。