【你问我答】Reentrantlock实现原理是怎样的?

问题描述:

Reentrantlock实现原理是怎样的?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##Java工程师##面试题目#
全部评论
其实大部分的锁都是使用了类似信号量的东西,就是一个变量,这个变量能被其他东西检测到,修改这个变量就是上锁的过程,检测这个变量的值就是查看是否上锁,在ReentrantLock中也是使用一个变量,不过它是借助了AQS,通过实现不同顺序加入等待队列来实现了公平或者非公平锁。真要拿出来分析能水三篇博客,个人感觉JUC的源码都可看看。
1 回复
分享
发布于 2020-09-15 12:30
首先Reentrantlock具有以下几个特性 1.可实现公平锁 2.可重入 3.条件变量 4.可打断 首先第一点,Reentrantlock是默认公平的,当我们调用其无参构造函数时,会创建NonfairSync对象,该对象继承自AQS,该对象在获取锁的时候不会去检查 AQS 队列,即每个线程都可以公平的去竞争锁,当调用了有参构造函数传入了fair参数时进入非公平锁,非公平锁在获取锁的时候会先检查 AQS 队列中是否有前驱节点, 没有才去竞争,即队列中位于头结点的线程可以获取锁。 第二,可重入,如果线程已经获得了锁, 并且判断获取锁的线程还是当前线程, 表示发生了锁重入,此时将state的值加1,表示又加了一次锁,释放锁时每释放一层锁对state减1。 第三条件变量,每个条件变量对应着一个等待队列,该队列的实现类为 ConditionObject。每一个 ConditionObject维护一个双向链表,当调用await()方法时,会将线程加入到对应条件变量的队列中。调用了signal()方法后会把条件队列中的第一个节点追加到等待队列中,即唤醒该线程去竞争锁。 第四可打断,Reentrantlock在默认情况下是不可打断的,在此模式下,即使它被打断,仍会留在AQS队列中,等获得锁后方能继续运行。在可打断模式下,调用interupt()方法,使LockSupport.park 取消阻塞的话,会抛出 InterruptedException,停止尝试获取锁。对应源码如下: if (shouldParkAfterFailedAcquire(p, node) &&                     parkAndCheckInterrupt())              throw new InterruptedException();
点赞 回复
分享
发布于 2020-09-20 21:00
联想
校招火热招聘中
官网直投

相关推荐

点赞 2 评论
分享
牛客网
牛客企业服务