阅读源码之ReentrantLock锁的获取与释放

第一次阅读源码,记录自己的阅读流程,方便日后查看

ReentrantLock是用了一个内部抽象类Sync来实现同步机制的
在这里插入图片描述
Sync的实现分别是NonfairSync(非公平锁)和FairSync(公平锁),默认是使用NonfairSync
在这里插入图片描述

首先从加公平锁开始
  • 在这里插入图片描述

  • 在这里插入图片描述

  • tryAcquire 方法是尝试直接获取锁,先沿着执行流程往下走,先看看tryAcquire 方法

  • 在这里插入图片描述

  • 很明显,aqs同步器需要实现类自定义获取锁的方法,那么看ReentrantLock 的实现

  • 在这里插入图片描述

  • 以上描述了方法的作用,接下来看看方法内部

  • 在这里插入图片描述

  • 接下来是compareAndSetState(0, acquires),这个就比较简单了,不看方法内部了。主要是可以获取锁的情况下,使用CAS防止多个线程同时获取锁。都执行成功则设置为持有者并返回。

  • 在这里插入图片描述

  • 获取锁成功则直接结束,失败的话首先会尝试将线程加入队列,看addWaiter方法

  • 在这里插入图片描述

  • 逻辑也比较简单,看注释即可,end方法

  • 在这里插入图片描述

  • 然后回到前面

  • 在这里插入图片描述

  • 看看acquireQueued内部,判断也比较简单,看注释即可

  • 在这里插入图片描述

  • 其中依靠shouldParkAfterFailedAcquire来判断线程是否需要挂起

  • 在这里插入图片描述

  • 然后就是挂起操作了在这里插入图片描述

  • 以上就是获取锁的整个流程

接着是释放锁
  • 调用释放锁的方法

  • 在这里插入图片描述

  • 具体方法
    在这里插入图片描述

  • 当然tryRelease() 是需要实现类自己实现的,接下来看看ReentrantLock的实现

  • 在这里插入图片描述
    在这里插入图片描述

  • 这里还是很简单的,就是对进入数减一,然后判断是否是多次进入再决定是否释放

  • 如果可以释放锁,那么释放后进入唤醒线程操作,也就是unparkSuccessor方法

  • 在这里插入图片描述

  • 这里也是比较简单的,看注释就明白了
    在这里插入图片描述

  • 线程唤醒,继续执行在这里插入图片描述

  • 然后又回到这个方法了,接下来的操作和前面一样

  • 在这里插入图片描述

  • 公平锁到这里结束

接下来说说非公平锁
  • 相比与公平锁,非公平锁其实就是获取锁时会直接使用CAS尝试获取
  • 在这里插入图片描述
  • 获取失败就又回到这里了
  • 在这里插入图片描述
  • 区别就是tryAcquire方法的实现不一样了,看看非公平锁的实现
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 看到这里其实就知道了,和公平锁的区别其实就是第一次获取会直接使用CAS去尝试获取锁,还有后续tryAcquire中state为0时,也会尝试直接获取,不管队列中是否为空。其余的部分是一致的
最后总结一下
  • 首先获取公平锁时,会先尝试直接获取锁,当队列中不存在其他节点或当前节点为首位,那么直接获取到锁。如果持有者为当前线程,则进入数+1后返回。获取失败则为当前线程生成节点,使用CAS加入到队列尾部,加入完成后就进入主要负责挂起唤醒的方法了,方法内部判断当前节点的前置是否是head,是则去获取锁,否则判断当前线程是否可以挂起,并判断前置节点状态是否大于0,大于0代表取消排队,如果前置节点的状态大于0,那么会去寻找前置节点的前置节点,直到小于0,并将该节点的后置指向当前节点,后面循环时如果前置节点的状态不为-1,那么还会尝试将其置为-1,然后将线程挂起
  • 非公平锁与公平锁相比,有两点不一样
    第一次获取时,直接使用CAS尝试获取锁
    后续的tryAcquire中,state为0时,也会直接去获取锁,不管队列是否为空
  • 然后就是释放锁,会先将锁的进入数进行减一操作,如果减一后为0,那么直接释放锁,然后唤醒队列中下一个状态小于0的等待节点进行唤醒。减一不为0,则返回false,不进行释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值