ReentranLock使用AQS实现同步锁原理、ReentranLock.lockInterruptibly()的实现原理

ReentranLock:

  1. 包括公平锁和非公平锁;
  2. 实现了Lock(一个锁的标准函数规范lock,tryLock,unLock...);
  3. 三个内部类Sync extends AbstractQueuedSynchronizer 抽象同步队列的子类、NonfairSync extends Sync 非公平锁队列、FairSync extends Sync 公平锁队列
  4. 属性final Sync sync用来实例化ReentranLock时,默认实例的sync是NonfairSync,用那种队列就是那种锁;

AQS:

  1. AbstractQueuedSynchronizer 抽象同步队列,专门用于同步锁开发的,线程的双链表队列
  2. 主要属性head队头,tail队尾,state锁状态(0是可用,大于0是被占用,比如是2证明锁被重入了一次)
  3. 队列的操作和state状态的改变用了大量的CAS操作
  4. 队列中的Node节点 属性:prev前一个,next后一个,waitStatus为0无后续节点 !=0(一般是-1)代表有后续等待节点.

ReentranLock的lockInterruptibly():

  1. ReentranLock的lockInterruptibly()方法较lock()多了可被打断的效果,需代码捕获打断异常,效果就是线程在拿锁或等锁的时候,如果被打断了,就会被叫醒抛出异常,依据原理:xxxthread.interrupt(),会给将线程打断状态标记为true,一旦sleep、wait、park的过程中发现这个标记变为true,会立刻返回且sleep、wait会立刻抛出InterruptedException,而park只是会被叫醒,如果想要抛出InterruptedException需要自己检测是否被打断了xxxthread.interrupted(),返回true,主动new抛出一个InterruptedException异常,lockInterruptibly()就是用后者方式实现的

 

下边那相对复杂的公平锁进行说明:图中加黑的部分是理解源码和原理的重点

 

如果想看流程图中操作对应的源码分析可以查看这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值