ReentrantLock
阻塞队列
共享/独占
公平/非公平
可重入 意义: 在同步方法块中也有可能调用外部方法,外部方法也加了锁,同步方法调用同步方法;如果不可重入将无法保证原子性
允许中断 :线程中的interrupt方法会中断该线程,是一种比较友好的结束线程的方法,在ReentrantLock的CLH队列中,如果线程节点出现异常,那么该节点就没有去获取锁的必要了,所以该节点会被置空,线程对象会被GC回收
实现原理:
4大关键:
自旋, LocksSuport (阻塞线程),CAS算法(加锁去锁), queue队列
CAS算法:任何时候多线程下只有一个线程可以修改指定的参数
继承了李二狗的AQS并发框架

队列的创建 双向链表 CLH队列 可以从头遍历 从尾部遍历增加性能


几个重要的参数
state:没加锁的前提下默认为0,表示锁没被任何线程持有
阻塞队列的参数
head:指向双向链表队列的头部
tail: 指向双向链表队列的尾部
prev:指向上一个队列节点
next:指向下一个队列节点
thread:將該節點加入隊列的線程。 在構造時初始化並在使用後歸零。



判断锁是否持有锁的方法
首先查看是否能够加锁 即getState 如果为0即可以加锁 接着判断阻塞队列是否有人排队,如果head 和tail (即队列的头部和尾部)相等 ,那么代表没有人排队 直接拿出该线程通过CAS算法加锁 将state改为1,将exclusiveOwnerThread指向得到锁的线程
如果不等于0,判断当前线程是否是持有锁的线程,如果是state+1 (锁的可重入)
如果不是则直接返回false,加锁失败
加锁失败的线程将尝试进入队列

要么加锁成功 tryAcquire
要么进入队列 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)

当前那个线程持有锁的指针 exclusiveOwnerThread
