CAS机制是什么?有什么缺点,会出现什么问题

CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。

CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。

CAS的缺点:

1.CPU开销较大

在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。

2.不能保证代码块的原子性

CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3个变量共同进行原子性的更新,就不得不使用Synchronized了。

3.ABA问题

这是CAS机制最大的问题所在。

什么是ABA问题?

引用原书的话:如果在算法中的节点可以被循环使用,那么在使用“比较并交换”指令就可能出现这种问题,在CAS操作中将判断“V的值是否仍然为A?”,并且如果是的话就继续执行更新操作,在某些算法中,如果V的值首先由A变为B,再由B变为A,那么CAS将会操作成功。

怎么避免ABA问题?

Java中提供了AtomicStampedReference和AtomicMarkableReference来解决ABA问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
悲观锁和乐观锁都是用于并发控制的技术。 悲观锁的思想是,在整个数据处理过程中,将数据进行加锁,防止其他线程对该数据进行修改。因此,其他线程需要等待锁被释放才能对数据进行修改。悲观锁的缺点是效率低下,因为它需要占用锁定资源的时间较长。 乐观锁的思想是,先假设所有线程都能成功修改数据,并进行修改。当某个线程提交时,先检查该数据是否被其他线程修改,如果未被修改,则提交成功,如果已经被修改,则后提交的线程需要进行重试。乐观锁的优点是效率高,缺点是可能存在矛盾和并发问题。 实现悲观锁,可以使用数据库中的行锁机制,在事务处理期间锁定某些数据行,防止其他事务对该数据进行修改。实现乐观锁,可以使用 CAS(Compare and Swap)算法,在对数据进行修改之前,先检查该数据是否已经被其他线程修改,如果该数据值未被修改,则执行修改,否则重试修改操作。 以下是Java中使用乐观锁的代码示例: ```java public class Account { private int balance; private int version; // 存款操作 public void deposit(int amount) { while(true) { int oldVersion = version; int newVersion = oldVersion + 1; int newBalance = balance + amount; if(compareAndSwap(oldVersion, newVersion, newBalance)) { balance = newBalance; version = newVersion; break; } } } // 使用CAS操作原子性进行比较 private boolean compareAndSwap(int oldVersion, int newVersion, int newBalance) { synchronized(this) { if(version == oldVersion) { balance = newBalance; version = newVersion; return true; } return false; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值