← 每日面试题 学习看板

什么是AQS的独占模式和共享模式?

面试题/00java/02Java 并发编程/02JUC工具类/什么是AQS的独占模式和共享模式?.md

面试记录 2026-09-29

题目:什么是 AQS 的独占模式和共享模式?

难度:low(题库标注)

标签:java/juc, difficulty/low

评分:⭐⭐⭐☆☆(3/5)

我的回答

AQS 的独占模式跟共享模式,其实有点类似于读锁跟写锁,MySQL 的读锁跟写锁独占就是正常的那个获取锁,进入线,进入一个线程,然后持有锁,然后其他线程等待。共享就是类似于信号量这种组件,它多个线程去更新对应的数量,更新到一定数量,多个线程都会更新,所以是共享的,大家更新完更新数量之后,达到一定量级才会执行下一步。

点评

优点:

不足:

补充(必背):

独占模式 vs 共享模式对照表:

维度独占模式共享模式
允许进入的线程数1 个多个
模板方法tryAcquire(int)tryAcquireShared(int)
state 语义0=空闲,非0=持有次数允许"部分消耗",多个线程共享 state
释放方法tryRelease(int)tryReleaseShared(int)
返回语义独占获得/释放(boolean)共享获得/释放(返回剩余量)

典型组件清单:

组件模式说明
ReentrantLock独占独占锁
ReentrantReadWriteLock.WriteLock独占写锁独占
ReentrantReadWriteLock.ReadLock共享读锁共享
Semaphore共享多个线程共享许可
CountDownLatch共享多个线程等待计数到 0
CyclicBarrier共享(部分)内部用了 AQS 共享语义
Phaser共享多阶段同步

AQS 核心结构(必背):

面试杀手锏:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察对 AQS 模板方法设计的理解,尤其"独占"和"共享"两种模式在实现层面的差异,以及它们如何支撑上层各种同步组件。

知识点拆解:

  1. 底层原理:AQS 是模板方法模式的典型应用——它固定了"排队 + 阻塞/唤醒"这套骨架,把"如何判断能不能获得同步状态"这个差异点交给子类的 tryAcquire/tryAcquireShared 去实现。独占模式返回 boolean(0/1 二选一),共享模式返回 int(允许多个线程同时进入),语义差异决定了整个实现路径不同
  2. 设计权衡:独占模式简单直接但并发度低,适合"临界区必须串行"的场景;共享模式灵活但实现复杂、可能加剧队头唤醒问题,适合"临界区可以并发"的场景
  3. 工程实践:写锁优先的 ReadWriteLock 是共享模式的反面案例(读多写少用共享,写多时独占锁反而更优);Semaphore 是共享模式最纯粹的实现,用 state 存许可数

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. AQS 的独占模式和共享模式能否同时用?
  1. 共享模式为什么要暴露 tryAcquireShared 的返回值(int)而不是 boolean?
  1. CountDownLatch 用的是独占还是共享?为什么?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,AQS 是 Java 并发包的基础框架,本质是一个模板方法:它把"如何排队、如何阻塞、如何唤醒"这套骨架固定下来,让子类只实现"如何判断能否获得同步状态"这个差异点。核心数据结构是两个——一个是 volatile int state 表示同步状态,语义由子类决定;另一个是 CLH 双向链表存等待线程。

独占模式和共享模式的核心区别只有一个:能不能同时允许多个线程进入临界区。独占模式同一时刻只允许一个线程持有,state 的语义是"0 空闲、非0 持有次数",模板方法是 tryAcquire 和 tryRelease,返回 boolean 表示拿到/没拿到。典型组件是 ReentrantLock 和 ReentrantReadWriteLock.WriteLock。

共享模式允许多个线程同时进入,state 的语义是"还剩多少许可",模板方法是 tryAcquireShared 和 tryReleaseShared,返回 int 表示剩余量以便下一个线程继续。典型组件是 ReentrantReadWriteLock.ReadLock、Semaphore、CountDownLatch——比如 Semaphore 的 permits 数直接存在 state 里,p=3 就允许 3 个线程同时进入。

ReentrantReadWriteLock 其实是"独占+共享"的组合:两个独立的 AQS 实例,写锁用独占模式、读锁用共享模式。面试里如果把 MySQL 的读写锁类比为 AQS 独占/共享,会不严谨——MySQL 读写锁本身就是"混合模式",等价于 Java 的 ReadWriteLock。

选型上,如果临界区必须串行用独占模式,追求并发度用共享模式,读多写少用 ReadWriteLock。