面试题:ReentrantLock(可重入锁)

1. 概述

ReentrantLock翻译过来是可重入锁,相对于synchronized它具备以下特点:

  • 可中断

  • 可以设置超时时间

  • 可以设置公平锁

  • 支持多个条件变量

  • 与synchronized一样,都支持重入

在这里插入图片描述

2. 实现原理

ReentrantLock主要利用CAS+AQS队列来实现。它支持公平锁和非公平锁,两者的实现类似

构造方法接受一个可选的公平参数(默认非公平锁),当设置为true时,表示公平锁,否则为非公平锁。公平锁的效率往往没有非公平锁的效率高,在许多线程访问的情况下,公平锁表现出较低的吞吐量。

查看ReentrantLock源码中的构造方法:

在这里插入图片描述

提供了两个构造方法,不带参数的默认为非公平

如果使用带参数的构造函数,并且传的值为true,则是公平锁

其中NonfairSync和FairSync这两个类父类都是Sync

在这里插入图片描述

而Sync的父类是AQS,所以可以得出ReentrantLock底层主要实现就是基于AQS来实现的

工作流程

在这里插入图片描述

  • 线程来抢锁后使用cas的方式修改state状态,修改状态成功为1,则让exclusiveOwnerThread属性指向当前线程,获取锁成功

  • 假如修改状态失败,则会进入双向队列中等待,head指向双向队列头部,tail指向双向队列尾部

  • 当exclusiveOwnerThread为null的时候,则会唤醒在双向队列中等待的线程

  • 公平锁则体现在按照先后顺序获取锁,非公平体现在不在排队的线程也可以抢锁

👨‍🏫 赤耳小永:从ReentrantLock到AQS源码-公平锁与非公平锁

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ReentrantLockJava中的一个可重入锁,它提供了与synchronized关键字类似的功能,但更加灵活和强大。下面是一些与ReentrantLock锁相关的面试题及其答案: 1. 什么是可重入锁可重入锁是指同一个线程可以多次获得同一个锁,而不会造成死锁。ReentrantLock就是一个可重入锁。 2. ReentrantLock相对于synchronized关键字有什么优势? 相对于synchronized关键字,ReentrantLock提供了更多的功能和灵活性。它可以实现公平锁和非公平锁,支持多个条件变量,可以中断等待锁的线程,还可以尝试获取锁等。 3. ReentrantLock如何实现可重入性? ReentrantLock通过记录持有锁的线程和持有次数来实现可重入性。当一个线程再次获取已经持有的锁时,它的持有次数会增加,当释放锁时,持有次数会减少,只有当持有次数为0时,其他线程才能获取该锁。 4. ReentrantLock如何实现公平性和非公平性? ReentrantLock可以通过构造函数来指定是公平锁还是非公平锁。公平锁会按照线程请求的顺序来获取锁,而非公平锁则允许插队,可能会导致某些线程一直获取不到锁。 5. ReentrantLock如何实现条件变量? ReentrantLock提供了Condition接口来支持条件变量。通过调用ReentrantLock的newCondition()方法可以创建一个Condition对象,然后可以使用该对象的await()、signal()和signalAll()方法来实现线程的等待和唤醒。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值