CAS和AQS详解(定义原理及区别图解)

CAS和AQS详解(定义原理及区别图解)-mikechen

CAS和AQS在Java多线程编程经常会涉及,但很多同步并不了解CAS和AQS原理,下面详解CAS和AQS@mikechen

CAS

CAS 是指 Compare and Swap(比较并交换)操作,它是一种并发编程中的原子操作,通常用于多线程环境下实现同步和线程安全。

CAS 操作通常包括三个参数:需要修改的变量 V、旧的期望值 A 和新的值 B。

更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。

如下图所示:

CAS和AQS详解(定义原理及区别图解)-mikechen

如上图显示线程1和线程2同时修改值,如果通过CAS 来实现。

具体流程如下:

  1. 在内存地址V当中,存储着值为7的变量;
  2. 线程1想要把变量的值增加1,对线程1来说,旧的预期值A=7,要修改的新值B=8;
  3. 线程2抢先一步,把内存值V修改:8;
  4. 线程1开始提交更新,首先对比了预期值A=7和实际值V的比较8(Compare),发现A不等于V的实际值,提交失败;

 

AQS

AQS 全称为 AbstractQueuedSynchronizer,AQS的主要作用是为Java中的并发同步组件提供统一的底层支持。

比如大家熟知的:ReentrantLockSemaphoreCountDownLatchCyclicBarrierReentrantReadWriteLock 等并发类均是基于AQS来实现的。

AQS原理,如下图所示:

CAS和AQS详解(定义原理及区别图解)-mikechen

AQS 原理的实现基于一个双向链表,这个链表中的每个节点都代表一个等待线程。

AQS 的主要实现思想是:

  1. 当多个线程争夺同一资源时,只有一个线程能够成功获取到该资源,其他线程则会被阻塞。
  2. 当该线程释放资源后,其他线程才能够重新竞争获取该资源。
  3. AQS 的实现使用了 CAS 操作和 Volatile 变量来保证并发安全性。

 

CAS和AQS的区别

CAS 和 AQS 都是Java多线程并发编程中实现线程安全的重要机制,但 CAS 更偏重于实现无锁算法,而 AQS 更多地被用于实现锁和同步机制。

以上就是CAS和AQS的详解,更多Java多线程,请查看:Java多线程编程详解(看这篇就足够了)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法