interview
interviewduck-java-backend
你真的理解 AQS 原理了吗

面试鸭 Java 后端面试题, 你真的理解 AQS 原理了吗?

面试鸭 Java 后端面试题, 你真的理解 AQS 原理了吗?

QA

Step 1

Q:: 什么是AQS?

A:: AQS(AbstractQueuedSynchronizer)是一个用于构建锁和同步器的框架,提供了一个基于FIFO(先进先出)等待队列的实现。AQS通过将线程的排队和状态管理抽象化,简化了同步器的开发。

Step 2

Q:: AQS的主要组成部分有哪些?

A:: AQS主要由状态(state)、等待队列(FIFO queue)和两种资源获取方式(独占和共享)组成。状态用于表示同步状态,等待队列用于管理等待线程,独占和共享模式则定义了资源的获取方式。

Step 3

Q:: AQS是如何管理线程的?

A:: AQS使用一个FIFO等待队列来管理线程。当一个线程尝试获取锁但失败时,它会被放入等待队列中。线程被唤醒时,会从队列中取出并重新尝试获取锁。AQS通过CAS操作(Compare-And-Swap)来确保线程安全。

Step 4

Q:: 什么是独占模式和共享模式?

A:: 独占模式(Exclusive)指只有一个线程能获取资源,例如ReentrantLock;共享模式(Shared)允许多个线程共享资源,例如CountDownLatch和Semaphore。AQS通过不同的模式来控制资源的访问方式。

Step 5

Q:: AQS中的状态是如何变化的?

A:: AQS中的状态使用一个整数变量来表示。通过CAS操作对状态进行修改,例如获取锁时状态增加,释放锁时状态减少。具体的状态值和含义取决于具体的同步器实现。

Step 6

Q:: 如何自定义一个同步器?

A:: 自定义同步器需要继承AQS并实现其抽象方法,如tryAcquire、tryRelease、tryAcquireShared和tryReleaseShared。这些方法定义了资源的获取和释放逻辑。通过这些方法,自定义同步器可以实现不同的同步策略。

Step 7

Q:: ReentrantLock是如何基于AQS实现的?

A:: ReentrantLock通过内部类Sync继承AQS,并实现了独占模式的资源获取和释放逻辑。在tryAcquire中,通过判断当前线程是否已经持有锁来决定是否增加锁的重入次数。在tryRelease中,减少锁的持有次数,当持有次数为0时释放锁。

用途

面试AQS的内容是为了考察候选人对Java并发编程的理解,尤其是对锁和同步机制的掌握。AQS是Java并发包中许多同步器的基础,了解AQS有助于深入理解ReentrantLock、CountDownLatch、Semaphore等高级并发工具的实现原理。在实际生产环境中,AQS及其实现类广泛用于控制并发访问,保障系统的线程安全和资源合理调度。\n

相关问题

🦆
什么是CAS操作?

CAS(Compare-And-Swap)是一种原子操作,用于实现无锁数据结构和同步机制。CAS操作比较内存中的值与预期值,如果相等则更新为新值,否则不更新。CAS在AQS中用于状态的修改。

🦆
ReentrantLock与synchronized的区别?

ReentrantLock是一个显式锁,具有更多的功能,如可中断锁获取、超时获取锁和公平锁,而synchronized是Java内置的隐式锁,使用简单但功能较少。ReentrantLock通过AQS实现,而synchronized由JVM直接支持。

🦆
CountDownLatch的原理是什么?

CountDownLatch基于AQS的共享模式实现。它使用一个计数器来控制多个线程的同步。主线程调用countDown减少计数器,当计数器为0时,所有等待的线程被唤醒继续执行。

🦆
Semaphore的实现及应用场景?

Semaphore基于AQS的共享模式实现,用于控制对资源的并发访问。它维护一个许可集,通过acquire和release方法获取和释放许可。Semaphore常用于限制访问某些资源的并发线程数量,如数据库连接池。

🦆
CyclicBarrier和CountDownLatch的区别?

CyclicBarrier和CountDownLatch都是用于线程同步的工具。CountDownLatch用于等待一组操作完成,计数器只能使用一次;而CyclicBarrier允许一组线程相互等待,计数器可以多次重置,适用于周期性任务。