Atomic原子类中的CAS语义存在的三个问题

本文探讨Atomic原子类在多线程环境中的应用,重点分析了其基于CAS的无锁化机制以及存在的三个问题:多变量原子性、ABA问题和无限循环。为解决这些问题,文章提到了AtomicReference、AtomicStampedReference以及JDK1.8后的LongAdder类,这些类通过不同的方式优化了并发性能。
摘要由CSDN通过智能技术生成

Atomic原子类,可能你没有用过,但你肯定知道,在多线程环境下i++这种的操作是无法保证结果的原子性的,如果使用Atomic原子类来递增的话,则不会有问题

Atomic原子类底层使用的就是CAS(compare and swap),这是一种无锁化的机制,比起synchronized关键字的加锁,CAS的效率要高上不少

简单来说,CAS其实就先将要修改的变量原值读出来,然后修改,最后再比较一下当前变量的值是不是跟第一次读取出来是一样的,如果是一样的话,那么就说明没有人改过,就修改变量;如果变了,那么说明变量已经被其他人修改了,再次重复这个操作,直到修改成功

CAS虽然效率很高,但也存在一些缺点的:

1、多变量原子问题:类似AtomicInteger、AtomicLong、AtomicBoolean这些Atomic都是对基本数据类型进行CAS操作,如果我们需要对多个变量保证原子性呢?
那么就需要使用AtomicReference,多个变量可以封装为一个自定义对象,使用AtomicReference的话就可以比较对象的引用是不是同一个,保证多个变量的原子性

2、经典的ABA问题:可能存在这么一种情况,变量当前值是A,这时线程1执行一次CAS操作,读出了这个变量的原值是A,然后线程2将变量的值改为了B,此时又来了一个线程3将变量的值从B又改为了A,最后线程1执行完了变量的修改,发现此时变量的值还是A,所以CAS操作成功了。但是变量经历了A -> B ->A这个过程,可能就会出现一些问题。

Atomic原子类中的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值