JUC中的CAS、ABA问题

CAS是CPU支持的一种指令,用于在多线程环境下实现原子性操作。它通过Unsafe类中的compareAndSwap方法实现,该方法在并发量大时可能导致自旋导致性能问题。ABA问题是一个潜在的并发问题,AtomicStampedReference可以用来解决这个问题,通过版本号跟踪变量的修改历史。
摘要由CSDN通过智能技术生成

CAS:比较并交换

        首先介绍一下Unsafe类,它是调用硬件层面的一个原子类,而CAS在该类中则有实现,类中 有使用native修饰的 compareAndSwap 开头的方法,使用的就是CAS技术,该方法调用C++中的cmpxchg的指令,C++的cmpxchg又回去调用CPU的cmpxchg指令,所以CAS是CPU支持的一种指令,CPU会进行判断如果是多核操作情况下还会加上lock指令,lock指令是CPU层面的锁,一般锁的粒度是缓存行级别。

        CAS中存在三个值:旧值、新值、版本号 ,其大致的思想类似mysql的行锁,因为同样都是乐观锁思想,使用旧值进行版本号比较,只有版本号一致的情况下才能对共享副本写入新值,否则进行自旋重试,所谓自旋意思是当查到旧值与版本号不一致,则进入自旋状态,底层大致实现就类似于利用死循环,获取失败休眠一段时间进行重试。直到修改成功,所以CAS在并发量大的时候是不推荐使用的。

        在AtomicInteger、AtomicLong....类中都有调用到compareAndSwap的方法来实现CAS操作

 Unsafe类compareAndSwap开头的方法:

调用C++中的cmpxchg指令

 调用CPU的cmpxchg指令

ABA问题

当AB两个线程去读取主内存中的变量进行修改时,A线程去修改主内存的同时B线程也在修改主内存中的共享副本,B线程提交了修改后A线程也提交了修改,覆盖了B线程的操作,产生ABA问题,JDK中提供AtomicStampedReference类来解决ABA问题,使用该类的 compareAndSet方法,修改值的同时指定版本号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值