关注
首先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
相关推荐
05-13 10:39
天津大学 搜索算法 
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你认为小厂实习有用吗? #
13749次浏览 186人参与
# 面试官是我前女友 #
106900次浏览 731人参与
# 实习生的蛐蛐区 #
39846次浏览 329人参与
# 当你面对裁员会如何? #
275927次浏览 2438人参与
# 计算机有哪些岗位值得去? #
12827次浏览 133人参与
# lastday知无不言 #
56853次浏览 460人参与
# 在职场上,你最讨厌什么样的同事 #
14421次浏览 150人参与
# 推荐一首陪你工作的歌吧 #
14006次浏览 97人参与
# 说说你知道的学历厂 #
28148次浏览 178人参与
# 你找工作的时候用AI吗? #
14807次浏览 192人参与
# 下班后的时间你怎么安排 #
7407次浏览 111人参与
# 哪一瞬间觉得自己长大了 #
7215次浏览 166人参与
# 携程求职进展汇总 #
559408次浏览 4258人参与
# 面试尴尬现场 #
23670次浏览 163人参与
# 工作后会跟朋友渐行渐远吗 #
30031次浏览 216人参与
# 中核求职进展汇总 #
20127次浏览 152人参与
# 社会教会你的第一课 #
29205次浏览 394人参与
# 多益网络工作体验 #
49628次浏览 280人参与
# 虾皮求职进展汇总 #
244165次浏览 1797人参与
# 神州信息工作体验 #
15997次浏览 75人参与