关注
首先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();
查看原帖
点赞 1
相关推荐
迷茫的小白在写bug:很长啊很长,感谢能耐心看完的牛油们
不要灰心米娜桑
查看28道真题和解析 点赞 评论 收藏
分享
查看5道真题和解析 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 有哪些公司在面试时考察AICoding? #
8854次浏览 184人参与
# 你认为小厂实习有用吗? #
137530次浏览 745人参与
# 厦门银行科技岗值不值得投 #
23745次浏览 500人参与
# HR面都在聊什么? #
7118次浏览 87人参与
# 如何快速融入团队? #
47857次浏览 299人参与
# 父母问你工作找得怎么样,怎么回 #
15473次浏览 193人参与
# AI“智障”时刻 #
34953次浏览 155人参与
# 找工作如何保持松弛感? #
136910次浏览 1469人参与
# AI时代还有必要刷leetcode吗? #
5728次浏览 97人参与
# 想从事Agent应该学习哪些技术? #
3972次浏览 131人参与
# 那些我实习了才知道的事 #
286766次浏览 1810人参与
# 什么人最适合大厂? #
8064次浏览 82人参与
# 哪些公司面试还在问八股? #
8207次浏览 83人参与
# 从投递到OC,你用了多久 #
14636次浏览 132人参与
# 顺丰求职进展汇总 #
84402次浏览 362人参与
# 查收我的offer竞争力报告 #
292574次浏览 1738人参与
# 如果没找到工作,考公是你的退路吗 #
70569次浏览 458人参与
# 双非本科的出路是什么? #
227640次浏览 1651人参与
# 哪一刻你突然觉得实习“有点值了” #
8870次浏览 71人参与
# 我的求职进度条 #
1033615次浏览 7090人参与
# 秋招踩过的“雷”,希望你别再踩 #
196184次浏览 1752人参与
