CAS和AQS在Java多线程编程经常会涉及,但很多同步并不了解CAS和AQS原理,下面详解CAS和AQS@mikechen
CAS
CAS 是指 Compare and Swap(比较并交换)操作,它是一种并发编程中的原子操作,通常用于多线程环境下实现同步和线程安全。
CAS 操作通常包括三个参数:需要修改的变量 V、旧的期望值 A 和新的值 B。
更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
如下图所示:
如上图显示线程1和线程2同时修改值,如果通过CAS 来实现。
具体流程如下:
- 在内存地址V当中,存储着值为7的变量;
- 线程1想要把变量的值增加1,对线程1来说,旧的预期值A=7,要修改的新值B=8;
- 线程2抢先一步,把内存值V修改:8;
- 线程1开始提交更新,首先对比了预期值A=7和实际值V的比较8(Compare),发现A不等于V的实际值,提交失败;
AQS
AQS 全称为 AbstractQueuedSynchronizer,AQS的主要作用是为Java中的并发同步组件提供统一的底层支持。
比如大家熟知的:ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier、ReentrantReadWriteLock 等并发类均是基于AQS来实现的。
AQS原理,如下图所示:
AQS 原理的实现基于一个双向链表,这个链表中的每个节点都代表一个等待线程。
AQS 的主要实现思想是:
- 当多个线程争夺同一资源时,只有一个线程能够成功获取到该资源,其他线程则会被阻塞。
- 当该线程释放资源后,其他线程才能够重新竞争获取该资源。
- AQS 的实现使用了 CAS 操作和 Volatile 变量来保证并发安全性。
CAS和AQS的区别
CAS 和 AQS 都是Java多线程并发编程中实现线程安全的重要机制,但 CAS 更偏重于实现无锁算法,而 AQS 更多地被用于实现锁和同步机制。
以上就是CAS和AQS的详解,更多Java多线程,请查看:Java多线程编程详解(看这篇就足够了)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》