CAS的优缺点

前言

什么是CAS?

CAS是compare and swap的缩写,即我们所说的比较交换。CAS是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加version来获取数据,性能较悲观锁有很大的提高。

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存地址里面的值和A的值是一样的,那么就将内存里面的值更新成B。CAS是通过无限循环来获取数据的,若果在第一轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程需要自旋,到下次循环才有可能机会执行。

CAS的带来的问题

①.CAS容易造成ABA问题。

问题描述:线程t1将它的值从A变为B,再从B变为A。同时有线程t2要将值从A变为C。但CAS检查的时候会发现没有改变,但是实质上它已经发生了改变 。可能会造成数据的缺失。

解决方法:CAS还是类似于乐观锁,同数据乐观锁的方式给它加一个版本号或者时间戳,如AtomicStampedReference

②.CAS造成CPU利用率增加

问题描述:多个线程争夺同一个资源时,如果自旋一直不成功,将会一直占用CPU。

解决方法:破坏掉for死循环,当超过一定时间或者一定次数时,return退出。JDK8新增的LongAddr,和ConcurrentHashMap类似的方法。当多个线程竞争时,将粒度变小,将一个变量拆分为多个变量,达到多个线程访问多个资源的效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
无锁数据结构是指在并发环境下,不使用锁的情况下来保证数据结构的正确性。这种数据结构通常使用原子操作和CAS(Compare-and-Swap)操作来实现同步。常见的无锁数据结构有以下几种: ### 1. 无锁队列 实现原理: 无锁队列使用原子操作来实现数据的入队和出队操作。比较常见的实现方式是使用循环数组来实现队列。入队和出队时,使用CAS操作来确保队列的正确性。 场景: 适用于生产者-消费者模型的场景,多个线程可以同时进行入队和出队操作。 限制: 无锁队列的性能受到CPU缓存大小和线程数的限制,线程数过多或者CPU缓存大小不足时,性能可能会受到影响。 优点: 无锁队列没有锁的开销,因此可以提高并发性能。 缺点: 实现复杂,容易出现竞争条件,需要考虑多线程下的内存可见性问题。 ### 2. 无锁栈 实现原理: 无锁栈使用原子操作来实现数据的入栈和出栈操作。入栈和出栈时,使用CAS操作来确保栈的正确性。 场景: 适用于多个线程同时对栈进行入栈和出栈操作的场景。 限制: 无锁栈的性能同样受到CPU缓存大小和线程数的限制,线程数过多或者CPU缓存大小不足时,性能可能会受到影响。 优点: 无锁栈没有锁的开销,因此可以提高并发性能。 缺点: 实现复杂,容易出现竞争条件,需要考虑多线程下的内存可见性问题。 ### 3. 无锁哈希表 实现原理: 无锁哈希表是使用原子操作和CAS操作来实现数据的插入、查找和删除操作。具体实现方式有链表和开放寻址法两种。 场景: 适用于多个线程同时对哈希表进行操作的场景。 限制: 无锁哈希表的性能同样受到CPU缓存大小和线程数的限制,线程数过多或者CPU缓存大小不足时,性能可能会受到影响。 优点: 无锁哈希表没有锁的开销,因此可以提高并发性能。 缺点: 实现复杂,容易出现竞争条件,需要考虑多线程下的内存可见性问题。 ### 4. 无锁计数器 实现原理: 无锁计数器使用原子操作来实现数据的递增和递减操作,通常使用CAS操作来实现。 场景: 适用于多个线程同时对计数器进行操作的场景。 限制: 无锁计数器的性能同样受到CPU缓存大小和线程数的限制,线程数过多或者CPU缓存大小不足时,性能可能会受到影响。 优点: 无锁计数器没有锁的开销,因此可以提高并发性能。 缺点: 实现简单,但是在高并发情况下可能会出现竞争条件,需要考虑多线程下的内存可见性问题。 总的来说,无锁数据结构在高并发场景下可以提高程序的性能,但是实现复杂,容易出现竞争条件,需要仔细考虑多线程下的内存可见性问题。同时,无锁数据结构的性能也会受到CPU缓存大小和线程数的限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值