AQS是什么?
几个JUC里面的类
这里不做详细介绍,只是说明一下类的作用
ReentrantLock
是一种锁机制,实现多个线程在临界区中的同步访问。也就是说实现了:同一时间只有一个线程能进入临界区,其他线程需要等待。
如果自己实现ReentrantLock的话,需要考虑哪些点?
- 通过某个变量来确定当前是哪个线程在持有锁,同时因为ReentrantLock是可重入锁,那么还需要维护加锁的次数
- 对于没抢到的锁的线程,需要阻塞,同时当其他线程释放锁时需要被唤醒
- 由于可能同一时间内没有抢到锁的线程很多,所以需要一个集合去管理这些线程
CountDownLatch
可以实现线程在某个点上等待其他线程执行完成,比如:一个线程等待其他线程处理完再向下执行,多个线程等待一个线程执行完后再向下执行。
如果自己实现CountDownLatch的话,需要考虑哪些点?tip:通过用法来考虑
- 通过某个变量来确定等待的线程什么时候可以继续执行
- 如果CountDownLatch中的val还没有到0,那么调用await的线程需要阻塞,同时当val减为0时调用await的线程需要被唤醒,并向下执行
- 由于调用await的线程可能很多,所以需要一个集合去管理这些线程
Semaphore
锁可以保证同一时间只有一个线程向下执行,而Semaphore可以实现同一时间有n个线程向下执行,比如我想限制某一个时刻只有n个线程可以访问数据库。因此,Semaphore(1)可以理解为一个互斥锁。
如果自己实现Semaphore的话,需要考虑哪些点?tip:通过用法来考虑
- 需要有某个变量来确定,我这个线程能不能向下执行,这里其实就是permits
- 对于没拿到permit的线程,需要阻塞,同时当其他线程释放permit时需要被唤醒
- 由于没有拿到permit的线程可能很多,所以需要一个集合来去管理这些线程
其实到这里我们就会发现这三个类虽然功能不同,但是实现它们所需的东西其实是类似的,而这个“东西”就是大名鼎鼎的AQS。如果没有AQS的话,就需要每个类各自实现类似的功能。
你可能会说这里有点像根据答案来反推的,的确如此,但是通过这种方式是可以更好的理解为什么会有AQS的。
AQS提供了什么功能?
AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器。【2】
这个框架为同步状态的原子性管理、线程的阻塞和解除阻塞以及排队提供了一种通用的机制。【3】
它提供了(与上面三个类一一对应):
- 同步状态的原子性原理,即保证上面三个类变量的线程安全,因为有多个线程会同时修改该变量,AQS是通过CAS来实现的(为什么不用synchronized?synchronized vs CAS)
- 线程的阻塞与解除阻塞,通过LockSupport.park()和LockSupport.unpark()实现的
- 队列的管理,通过一个双向链表实现的
AQS源码分析
...
参考
- 慕课网《玩转Java并发工具,精通JUC,成为并发多面手》
- https://www.pdai.tech/ Java并发编程部分
- https://www.cnblogs.com/dennyzhangdd/p/7218510.html Doug Lea论文翻译
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义