Java并发面试题, 说说 AQS 吧?
Java并发面试题, 说说 AQS 吧?
QA
Step 1
Q:: 说说 AQS 吧?
A:: AQS,全称为AbstractQueuedSynchronizer,是Java并发包中的一个基础框架,广泛用于实现同步器,比如ReentrantLock、CountDownLatch、Semaphore等。AQS 通过一个FIFO的等待队列来管理线程的同步,线程的状态和排队机制在AQS中非常重要。它提供了两种同步模式:独占模式和共享模式。独占模式下,只有一个线程可以获得锁,而在共享模式下,多个线程可以同时获得锁。AQS 主要通过CAS操作来实现状态的原子性更新,并通过内部的Node结构维护线程队列。在面试中问到AQS,考察的是候选人对Java并发基础设施的理解,尤其是锁和线程间协作的机制。
Step 2
Q:: AQS的工作原理是什么?
A:: AQS通过一个volatile类型的int变量state来表示同步状态,通过CAS操作确保状态的安全更新。AQS的核心是一个双向队列(FIFO),每个线程试图获取锁时,如果无法获取,将会被加入到队列的尾部并阻塞。AQS的主要操作包括acquire、release、acquireShared、releaseShared等,这些操作通过修改state的值和操作线程队列来控制线程的同步。
Step 3
Q:: AQS的独占模式与共享模式有什么区别?
A:: AQS 的独占模式允许只有一个线程获取资源,其他线程会被阻塞,直到当前线程释放资源。典型的例子是ReentrantLock。共享模式允许多个线程同时获取资源,例如Semaphore和CountDownLatch。区别在于,独占模式只允许一个线程持有锁,而共享模式下,多个线程可以同时访问共享资源。
Step 4
Q:: 如何自定义同步器,基于AQS?
A:: 要自定义同步器,首先需要继承AQS,并实现其模板方法如tryAcquire、tryRelease、tryAcquireShared和tryReleaseShared。这些方法需要根据具体的同步器逻辑来实现。然后,通过调用AQS提供的acquire、release等方法来实现线程的同步逻辑。举个例子,可以实现一个自定义的不可重入锁,重写tryAcquire方法,通过CAS操作将state从0改为1
,表示锁被持有。