CAS和AQS

本文深入探讨了Java并发中的CAS(Compare and Swap)机制及其在ConcurrentHashMap中的应用,分析了ABA问题及其解决方案。接着,介绍了AQS(AbstractQueuedSynchronizer)的工作原理,包括其维护等待线程的机制,并通过CLH队列和CAS实现线程同步。文章还列举了AQS在ReentrantLock、Semaphore和CountDownLatch等同步组件中的应用,并比较了CountDownLatch和CyclicBarrier的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、CAS是乐观锁,在concurrentHashmap中的putval方法中会用到CAS
非阻塞的实现CAS:CAS指令需要3个操作数,分别是内存地址(在JAVA中理解为变量的内存地址,用V表示),旧的预期值(用A表示),新值(B)。CAS指令执行时,当且仅当V处的值符合旧预期值A时,处理器用B更新A值,否则它就不执行更新,但是无论是否更新了V处的值,都会返回V的旧值,上述的处理过程是一个原子操作。
CAS缺点 :ABA问题:因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是一个值原来是A,变成B,又变成A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。
ABA问题的解决思路就是使用版本号。在变量前面追加版本号,每次变量更新的时候把版本号加一,那么A-B-A就变成了1A-2B-3C。

**2、CAS还有可能引发的问题**:
1.ABA问题;
2.不停的自旋等待,造成处理器资源浪费; (可以通过加sleep+自旋,这样可以让线程进入睡眠)
3.CAS只能保证对一个变量操作的原子性,而不能保证对代码块操作的原子性

当许多线程都可以进入一个方法内对变量进行修改的时候,由于线程数量过于密集,导致大部分进程都无法成功修改变量的值,白白在那里循环消耗着资源。所以java对它进行了优化引入了一个cell[]数组,比如有5个线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值