ReentrantLock简介
基本语法![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ba8e17774681f7aed65df1a1629ce379.png)
特点
-
可重入(允许当前线程获得了该锁之后再次加锁)
-
可打断(当前线程如果有竞争就进入阻塞队列,可以被其他线程用interrupt方法打断等待状态此时会抛出异常)
-
锁超时(可以用tryLock方法加锁并且支持加等待时间超过等待时间没有得到锁返回false)
-
公平锁(可以在创建锁的时候设置true或false,公平锁为true默认为不公平锁,公平锁在阻塞队列中是按照进入的顺序获得锁而不是再次竞争)
-
条件变量ReentrantLock支持多条件变量
与synchronized对比![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/27d0ab6d3ca373f938cb91bcae0bdfc0.png)
ReentrantLock原理
AQS原理
概述
AQSjava中本质是一个抽象类。ReentrantLock用到了该类的对象
加锁成功流程
Sync继承AQS是一个抽象类有两个实现类一个是NonfairSync和FairSync公平锁和非公平锁, ReentrantLock继承了Lock接口Node是AQS中的节点。
当没有竞争的时候加锁会执行以上方法秀爱state的值为1,并把当前线程设置到exclusiveOwnerThread.
获得(第一次)锁失败后再次尝试(第二次)获得锁再次失败会构造当前线程对应节点,如果处于第二个节点即头节点之后会再次(第三次)尝试获得锁,失败后然后会把前驱节点的状态改为-1表示有责任唤醒后继节点最终进入阻塞(park)
释放锁的流程
可重入原理
当前线程再次加锁会把state进行累加,释放的时候会把当前state进行减一
不可打断原理
不可打断模式当Thread.interruped被设置为真时会进入if把interruped设置为true知道获得锁之后返回true当前线程会被终止
可打断原理
当Thread.interruped被设置为真时会进入if会直接抛出异常终止不会等到获得锁之后停止
公平锁实现原理
条件变量实现原理
当前线程调用await会创建节点加到condition队列中并设置状态为-2