Java ReentrantLock面试题

1. `ReentrantLock`是什么?

ReentrantLock是Java并发包提供的一种可重入的互斥锁。

2. `ReentrantLock`与`synchronized`关键字有什么区别?

  • ReentrantLock是显式锁,需要手动进行加锁和解锁操作,而synchronized关键字是隐式锁,由JVM自动管理锁的加锁和解锁。
  • ReentrantLock提供了更灵活的锁操作,如可重入性、公平锁和非公平锁等。
  • ReentrantLock可以绑定多个Condition,实现更细粒度的等待和唤醒操作。

3. `ReentrantLock`如何实现可重入性?

ReentrantLock通过维护一个持有计数来实现可重入性,每次成功获取锁时计数增加,释放锁时计数减少。

4. `ReentrantLock`的公平锁和非公平锁有什么区别?

  • 公平锁确保等待时间最长的线程优先获取锁,非公平锁不保证这一点,可能导致饥饿现象。

5. `ReentrantLock`的`lock()`和`unlock()`方法的作用是什么?

lock()方法用于获取锁,如果锁已被其他线程占用,则当前线程阻塞;unlock()方法用于释放锁。

6. `ReentrantLock`的`tryLock()`方法有什么作用?

tryLock()方法尝试获取锁,如果锁可用,则获取锁并返回true,否则立即返回false

7. `ReentrantLock`的`tryLock(long timeout, TimeUnit unit)`方法有什么作用?

这个方法尝试获取锁,如果锁在指定的等待时间内可用,则获取锁并返回true,否则返回false

8. `ReentrantLock`的`lockInterruptibly()`方法有什么作用?

lockInterruptibly()方法用于中断ibly获取锁,如果当前线程在等待获取锁的过程中被中断,则会抛出InterruptedException

9. `ReentrantLock`如何实现条件变量?

ReentrantLock通过newCondition()方法创建一个与当前锁相关联的条件变量。

10. `ReentrantLock`的`Condition`接口有什么作用?

Condition接口用于实现等待/通知模式,允许线程在某些条件不满足时挂起,并在条件满足时被唤醒。

11. `ReentrantLock`的`getHoldCount()`方法有什么作用?

getHoldCount()方法返回当前线程保持此锁的次数。

12. `ReentrantLock`的`getWaitQueueLength(Condition condition)`方法有什么作用?

getWaitQueueLength(Condition condition)方法返回给定条件对象上等待的线程估计数。

13. `ReentrantLock`的`hasWaiters(Condition condition)`方法有什么作用?

hasWaiters(Condition condition)方法查询是否有线程正在等待给定的条件。

14. `ReentrantLock`的`hasQueuedThreads()`方法有什么作用?

hasQueuedThreads()方法查询是否有线程正在等待获取此锁。

15. `ReentrantLock`的`isHeldByCurrentThread()`方法有什么作用?

isHeldByCurrentThread()方法查询当前线程是否保持此锁。

16. `ReentrantLock`的`isLocked()`方法有什么作用?

isLocked()方法查询此锁是否由任何线程保持。

17. `ReentrantLock`的`getOwner()`方法有什么作用?

getOwner()方法返回当前保持此锁的线程,如果没有线程保持此锁,则返回null

18. `ReentrantLock`的`hasWaiters()`方法有什么作用?

hasWaiters()方法查询是否有线程正在等待获取此锁。

19. `ReentrantLock`的`getQueueLength()`方法有什么作用?

getQueueLength()方法返回等待获取此锁的线程估计数。

20. `ReentrantLock`的`unlock()`方法在什么情况下会抛出异常?

unlock()方法在当前线程不是此锁的持有者时会抛出IllegalMonitorStateException异常。

21. `ReentrantLock`的`lock()`方法在什么情况下会抛出异常?

lock()方法通常不会抛出异常,但如果当前线程被中断,可能会抛出IllegalThreadStateException异常。

22. `ReentrantLock`的`tryLock()`方法能否响应中断?

tryLock()方法不能响应中断,但如果需要响应中断,可以使用lockInterruptibly()方法。

23. `ReentrantLock`的`lockInterruptibly()`方法能否响应中断?

lockInterruptibly()方法可以响应中断,如果当前线程在等待获取锁的过程中被中断,则会抛出InterruptedException

24. `ReentrantLock`的`newCondition()`方法如何使用?

newCondition()方法用于创建与当前锁相关联的条件变量,可以用于实现更细粒度的等待/通知模式。

25. `ReentrantLock`的`Condition`对象的`await()`和`signal()`方法有什么作用?

await()方法使当前线程等待,直到收到通知或被中断;signal()方法唤醒在此条件变量上等待的单个线程。