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()
方法唤醒在此条件变量上等待的单个线程。