ReentranLock:
- 包括公平锁和非公平锁;
- 实现了Lock(一个锁的标准函数规范lock,tryLock,unLock...);
- 三个内部类Sync extends AbstractQueuedSynchronizer 抽象同步队列的子类、NonfairSync extends Sync 非公平锁队列、FairSync extends Sync 公平锁队列
- 属性final Sync sync用来实例化ReentranLock时,默认实例的sync是NonfairSync,用那种队列就是那种锁;
AQS:
- AbstractQueuedSynchronizer 抽象同步队列,专门用于同步锁开发的,线程的双链表队列
- 主要属性head队头,tail队尾,state锁状态(0是可用,大于0是被占用,比如是2证明锁被重入了一次)
- 队列的操作和state状态的改变用了大量的CAS操作
- 队列中的Node节点 属性:prev前一个,next后一个,waitStatus为0无后续节点 !=0(一般是-1)代表有后续等待节点.
ReentranLock的lockInterruptibly():
- ReentranLock的lockInterruptibly()方法较lock()多了可被打断的效果,需代码捕获打断异常,效果就是线程在拿锁或等锁的时候,如果被打断了,就会被叫醒抛出异常,依据原理:xxxthread.interrupt(),会给将线程打断状态标记为true,一旦sleep、wait、park的过程中发现这个标记变为true,会立刻返回且sleep、wait会立刻抛出InterruptedException,而park只是会被叫醒,如果想要抛出InterruptedException需要自己检测是否被打断了xxxthread.interrupted(),返回true,主动new抛出一个InterruptedException异常,lockInterruptibly()就是用后者方式实现的
下边那相对复杂的公平锁进行说明:图中加黑的部分是理解源码和原理的重点
如果想看流程图中操作对应的源码分析可以查看这里