Java AQS面试题
1. AQS是什么?
AQS是AbstractQueuedSynchronizer的缩写,它是Java并发包中一个用于实现同步器的抽象基类,提供了一种基于队列的同步机制。
2. AQS的主要作用是什么?
AQS的主要作用是为构建锁和同步器提供一种高效的方式,它允许开发者实现自己的同步控制。
3. AQS的组成有哪些?
AQS主要由状态变量state、一个FIFO队列、条件变量队列等组成。
4. AQS如何实现独占锁?
AQS通过维护一个状态变量state来实现独占锁,当线程尝试获取锁时,会尝试将state从0变为1,如果成功则获取锁。
5. AQS如何实现共享锁?
AQS允许多个线程同时获取锁,通过state的高16位表示共享锁的计数,低16位表示独占锁的状态。
6. AQS中的队列是什么?
AQS中的队列是一个FIFO队列,用于管理等待获取同步状态的线程。
7. AQS如何实现线程的阻塞和唤醒?
AQS通过内置的方法实现线程的入队、出队、阻塞和唤醒等操作。
8. AQS支持哪些同步模式?
AQS支持独占模式和共享模式两种同步模式。
9. AQS中的条件等待与唤醒是如何实现的?
AQS提供了条件等待与唤醒的功能,通过Condition对象可以实现线程的等待和唤醒机制。
10. AQS的state状态有什么作用?
state状态用于表示同步状态,不同的同步器可以根据自己的需求使用同步状态来表示不同的含义。
11. AQS的模板方法有哪些?
AQS的模板方法包括tryAcquire
、tryRelease
、tryAcquireShared
和tryReleaseShared
等,用于实现具体的同步逻辑。
12. AQS如何实现可重入性?
AQS通过state的增加和减少来实现可重入性,例如,当同一个线程多次获取锁时,state的值会相应增加。
13. AQS与ReentrantLock的关系是什么?
ReentrantLock是基于AQS实现的,它内部包含了一个AQS对象,用于控制锁的获取和释放。
14. AQS如何实现公平锁和非公平锁?
AQS通过不同的模板方法实现公平锁和非公平锁,例如,公平锁在尝试获取锁时会检查队列中是否有等待的线程。
15. AQS的锁升级过程是怎样的?
AQS的锁升级过程是从偏向锁到轻量级锁,再到重量级锁,这个过程是单向的,不会降级。
16. AQS的等待队列和条件队列有什么区别?
等待队列用于管理等待获取同步状态的线程,而条件队列用于管理等待特定条件的线程。
17. AQS如何实现多个条件变量?
AQS通过Condition对象实现多个条件变量,每个Condition对象对应一个条件队列。
18. AQS的`isHeldExclusively`方法有什么作用?
isHeldExclusively
方法用于判断当前线程是否正在独占资源,只有使用到Condition时才需要实现它。
19. AQS的`acquire`和`release`方法有什么作用?
acquire
方法用于获取同步状态,release
方法用于释放同步状态,它们都是模板方法。
20. AQS的`tryAcquireNanos`方法有什么作用?
tryAcquireNanos
方法尝试获取同步状态,支持超时参数,如果超时则返回负值。
21. AQS的`compareAndSetState`方法有什么作用?
compareAndSetState
方法是一个原子操作,用于安全地更新state的值。
22. AQS的`getState`和`setState`方法有什么作用?
getState
方法用于获取当前同步状态,setState
方法用于设置同步状态。
23. AQS的`getQueuedThreads`方法有什么作用?
getQueuedThreads
方法返回一个估计的等待队列中的线程集合。
24. AQS的`hasQueuedPredecessors`方法有什么作用?
hasQueuedPredecessors
方法用于判断当前线程的节点是否有其他线程在等待队列中排在它前面。
25. AQS的`acquireInterruptibly`方法有什么作用?
acquireInterruptibly
方法用于中断ibly获取同步状态,如果当前线程被中断,则抛出InterruptedException
。