首先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

相关推荐

Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
每晚夜里独自颤抖:要求太多的没必要理
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务