AQS 为什么是并发工具的基础

AQS 为什么是并发工具的基础

在 Java 并发编程中,AQS(AbstractQueuedSynchronizer)是理解 ReentrantLock、Semaphore、CountDownLatch 等工具的关键。很多开发者每天在用这些并发工具,却未必清楚它们的底层实现都依赖同一个框架。本文从实际应用角度梳理 AQS 的核心思想,结合源码片段说明它是如何支撑各种同步器的。

先建立一个最小案例

并发问题不要一开始就上复杂业务。可以先准备一个计数器场景:

class Counter {
private int count = 0;

public void add() {
count++;
}

public int get() {
return count;
}
}

这段代码在单线程里没有问题,但多线程同时调用 add() 时,count++ 不是原子操作,结果可能比预期小。

正确处理思路

如果只是简单计数,可以用 AtomicInteger

class Counter {
private final AtomicInteger count = new AtomicInteger();

public void add() {
count.incrementAndGet();
}

public int get() {
return count.get();
}
}

如果临界区里有多步业务逻辑,可以考虑 synchronizedReentrantLock。选择时不要只看性能,先看代码是否清晰、锁范围是否足够小、异常时是否能释放锁。

排查建议

线上并发问题通常不稳定复现。可以先看日志里是否有重复请求、状态覆盖、库存扣减异常,再用压测或单元测试构造并发场景。

核心要点

  1. AQS 的核心是一个共享状态(state)加上一个双向链表,线程获取锁失败时会被包装成节点加入队列等待

  2. 独占模式和共享模式是 AQS 支持的两种基本模式,分别对应 ReentrantLock 和 Semaphore

  3. tryAcquire/tryRelease 等方法由子类实现,AQS 提供模板方法和队列管理

  4. ConditionObject 是 AQS 的内部类,实现了 Condition 接口,支持线程等待/通知

总结

理解 AQS 不仅能帮你更好地使用并发工具,遇到问题时也能快速定位根源。比如排查死锁、分析线程阻塞原因时,知道 AQS 的工作机制会非常有帮助。


   转载规则


《AQS 为什么是并发工具的基础》 小乐 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录