本期说一下ReentrantLock的相关面试题。
Lock接口
-
是JDK层面锁 -
悲观锁 -
可重入锁。(可重入锁(Reentrant Lock)是一种支持线程重复获取锁的锁机制。当一个线程已经获得了可重入锁后,它可以再次请求该锁而不会被阻塞,这就是锁的可重入性。ReentrantLock和synchronized都是可重入锁) -
Lock接口的实现类 -
ReentrantLock 是一个可重入锁的实现,支持公平和非公平的锁获取。它提供了与 synchronized 关键字相似的功能,但更加灵活,可以支持更复杂的同步需求。 -
示例代码
-
private final Lock lock = new ReentrantLock();
void example(){
lock.lock(); // 获取锁
try {
// 执行被保护的代码块
} finally {
lock.unlock(); // 释放锁
}
}
-
ReentrantReadWriteLock 是可重入的读写锁,它允许多个线程同时读取共享资源,但只允许一个线程写入。它由读锁(ReadLock)和写锁(WriteLock)组成。 -
StampedLock 是 JDK 8 引入的锁机制,它包含了乐观读锁、悲观读锁和写锁。它提供了更细粒度的控制,特别适用于读多写少的场景。
ReentrantLock锁过程是否可中断,与之对应的synchronized可中断吗?
答:
-
ReentrantLock提供了可中断的锁获取过程。当线程调用lockInterruptibly时,如果当前线程被中断(interrupt),它将尽快响应中断请求,并且在锁定期间发生中断时抛出InterruptedException。
-
在 Java 中,使用synchronized关键字进行同步的锁是不可中断的。当线程试图获取一个对象的锁时,如果锁已经被其他线程占用,那么当前线程将进入阻塞状态,等待锁的释放。在这个等待的过程中,如果其他线程中断了当前线程,那么当前线程不会响应中断,而是会继续等待获取锁。
ReentranLock的可重入实现原理?
答:
-
ReentrantLock的可重入功能基于AQS的同步状态:state。 -
其原理大致为:当某一线程获取锁后,将state值+1,并记录下当前持有锁的线程,再有线程来获取锁时,判断这个线程与持有锁的线程是否是同一个线程,如果是,将state值再+1,如果不是,阻塞线程。 当线程释放锁时,将state值-1,当state值减为0时,表示当前线程彻底释放了锁,然后将记录当前持有锁的线程的那个字段设置为null,并唤醒其他线程,使其重新竞争锁。
ReetrantLock非公平锁实现过程?
答:
一个线程1获取到了锁,其他很多没获取到锁的线程(others_t)加入到了AQS的同步队列中等待,当这个线程执行完后,会去唤醒AQS同步队列中的下一个线程,被唤醒的线程和新来的线程重新竞争锁(不包含同步队列后面的那些线程),这些新来的线程相当于没有去排队而是直接插队和队首的被唤醒的线程一起竞争锁。
以上内容出自本人整理的面试秘籍。 链接: https://pan.baidu.com/s/1o014Ems8diV0D3h8K15olA?pwd=fi3x 提取码: fi3x 复制这段内容后打开百度网盘手机App,操作更方便哦
工作日每天更新,周末随缘更新。
请关注我,以便及时获取最新内容哦!
本文由 mdnice 多平台发布