关注
首先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
相关推荐
11-09 20:31
中南民族大学 软件测试 点赞 评论 收藏
分享
牛客热帖
- 1... 大四,双非二本,求指教,目前有一个offer但是一个月工资只有600要不要去啊3877
- 2... 【发帖有奖】新活动来啦,发帖评公司,最高可得100元京东卡~3837
- 3... 西安荣耀嵌入式oc3833
- 4... 大厂们也算是卷起来了。。3627
- 5... 3个月前的我未免对秋招过于乐观了3479
- 6... 挑战全网最孝手孝子3386
- 7... 求职银行的宝子们,最新的银行笔试题已公开,免费刷!3222
- 8... 开奖了,A到了398,000!3015
- 9... 好消息是早就oc了,坏消息是一直没开奖2990
- 10... 不要美化自己没选择的道路2937
正在热议
# 晒一晒我的offer #
9500046次浏览 103768人参与
# 你的秋招第一场笔试是哪家 #
37892次浏览 533人参与
# 签约/解约注意事项 #
299190次浏览 1877人参与
# OPPO求职进展汇总 #
541347次浏览 4437人参与
# 非技术er求职现状 #
20157次浏览 186人参与
# 我的实习求职记录 #
5935773次浏览 82673人参与
# 你想留在一线还是回老家? #
7418次浏览 155人参与
# AI了,我在打一种很新的工 #
18837次浏览 424人参与
# 大疆求职进展汇总 #
393445次浏览 2830人参与
# 许愿池 #
201918次浏览 2483人参与
# 通信硬件公司评价 #
80557次浏览 354人参与
# 设计人如何选offer #
37714次浏览 464人参与
# 工作给你带来了哪些职业病 #
8139次浏览 96人参与
# 人生第一个10万你是多久存到的? #
17356次浏览 207人参与
# 运营来爆料 #
9913次浏览 168人参与
# 安利/避雷我的岗位 #
369792次浏览 4504人参与
# 面试体验感最好的是哪家? #
74407次浏览 733人参与
# 设计人的面试记录 #
70891次浏览 926人参与
# 选了这个offer,你有没有后悔? #
372809次浏览 2945人参与
# 如何判断面试是否凉了 #
2464727次浏览 30654人参与