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

相关推荐

喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
牛客网
牛客企业服务