关注
首先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
相关推荐
牛客热帖
更多
正在热议
更多
# 实习的你做了哪些离谱的工作 #
7336次浏览 107人参与
# 小厂实习有必要去吗 #
77752次浏览 368人参与
# MiniMax求职进展汇总 #
1707次浏览 26人参与
# 为了入行xx岗,我学了__ #
4635次浏览 89人参与
# Prompt分享 #
1388次浏览 46人参与
# 简历第一个项目做什么 #
5900次浏览 92人参与
# 你都见过什么样的草台班子? #
2868次浏览 40人参与
# 被说“做题家”,你的反应是_____? #
1025次浏览 41人参与
# 如果让你发明个APP,你会想做什么 #
1490次浏览 46人参与
# 听到哪句话代表面试稳了OR挂了? #
124473次浏览 559人参与
# 工作压力大,你会干什么? #
10456次浏览 252人参与
# 找实习记录 #
21929次浏览 393人参与
# 大家实习每天都在干啥 #
111959次浏览 605人参与
# 如果不上班,你会去做什么 #
5268次浏览 226人参与
# 邪修省钱套路 #
6155次浏览 211人参与
# 金三银四,你有感觉到吗 #
673270次浏览 6040人参与
# AI让你的思考变深了还是变浅了? #
3576次浏览 105人参与
# 分享一个让你热爱工作的瞬间 #
57096次浏览 482人参与
# 我的求职精神状态 #
419319次浏览 3071人参与
# 通信硬件薪资爆料 #
1200177次浏览 7192人参与
# 你觉得实习只能是打杂吗? #
266223次浏览 1685人参与
上海得物信息集团有限公司公司福利 1263人发布