AQS 为什么是并发工具的基础
在 Java 并发编程中,AQS(AbstractQueuedSynchronizer)是理解 ReentrantLock、Semaphore、CountDownLatch 等工具的关键。很多开发者每天在用这些并发工具,却未必清楚它们的底层实现都依赖同一个框架。本文从实际应用角度梳理 AQS 的核心思想,结合源码片段说明它是如何支撑各种同步器的。
先建立一个最小案例
并发问题不要一开始就上复杂业务。可以先准备一个计数器场景:
class Counter { |
这段代码在单线程里没有问题,但多线程同时调用 add() 时,count++ 不是原子操作,结果可能比预期小。
正确处理思路
如果只是简单计数,可以用 AtomicInteger:
class Counter { |
如果临界区里有多步业务逻辑,可以考虑 synchronized 或 ReentrantLock。选择时不要只看性能,先看代码是否清晰、锁范围是否足够小、异常时是否能释放锁。
排查建议
线上并发问题通常不稳定复现。可以先看日志里是否有重复请求、状态覆盖、库存扣减异常,再用压测或单元测试构造并发场景。
核心要点
AQS 的核心是一个共享状态(state)加上一个双向链表,线程获取锁失败时会被包装成节点加入队列等待
独占模式和共享模式是 AQS 支持的两种基本模式,分别对应 ReentrantLock 和 Semaphore
tryAcquire/tryRelease 等方法由子类实现,AQS 提供模板方法和队列管理
ConditionObject 是 AQS 的内部类,实现了 Condition 接口,支持线程等待/通知
总结
理解 AQS 不仅能帮你更好地使用并发工具,遇到问题时也能快速定位根源。比如排查死锁、分析线程阻塞原因时,知道 AQS 的工作机制会非常有帮助。