1. AQS概述
- 全称: AbstractQueuedSynchronizer
 - 目的: 提供一种用于构建锁和其他同步器的框架,用于控制对共享资源的访问。
 
2. 设计思想
- 基于队列的同步器: AQS使用一个FIFO队列来管理那些线程在等待某个资源。
 - 公平性: 通过队列来确保先等待的线程先获得资源。
 - 灵活性: 允许开发者自定义同步器的更多行为。
 
3. 核心概念
- state: 表示同步状态,通过CAS操作保证状态的原子性。
 - exclusiveOwnerThread: 记录当前持有独占锁的线程。
 
4. 资源抢占
- CAS: 用于实现无锁的线程安全操作。
 - UNSAFE: 用于执行低级别的内存操作。
 
5. 同步队列
- 双向链表: 所有等待的线程节点(Node)构成一个双向链表。
 - head和tail: 表示队列的头部和尾部,AQS主要操作这两个节点。
 
6. 线程阻塞与唤醒
- LockSupport.park: 阻塞当前线程。
 - LockSupport.unpark: 唤醒指定线程。
 
7. 线程通信
- Node结构: 包含线程引用(waiter)和状态(status),用于线程间的通信。
 
8. 被唤醒线程的行为
- 再次尝试抢占: 被唤醒的线程会再次尝试获取资源,而不是直接获得资源。
 
9. Condition队列
- await/signal: 类似于Object的wait/notify机制,用于线程间的协调。
 
10. 设计哲学
- 从使用到理解: 初学者学习如何使用,进阶者理解原理,高手思考设计原因。
 
11. 总结
- AQS是Java并发包的核心,理解其设计思想对于开发高性能并发应用至关重要。
 - 设计者通过AQS展示了如何用一种通用的方式来处理并发问题,提供了构建各种锁和其他同步器的灵活性。