聊聊 ReentrantLock 吧

发布时间 2023-03-31 00:01:42作者: Booker003

ReentrantLock 意为「可重入锁」,说起 ReentrantLock 就不得不说 AQS ,因为其底层就是「使用 AQS 去实现」的。

ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。

  • 公平模式下等待线程入队列后会严格按照队列顺序去执行

  • 非公平模式下等待线程入队列后有可能会出现插队情况

「公平锁」

 

  • 第一步:「获取状态的 state 的值」

    • 如果 state=0 即代表锁没有被其它线程占用,执行第二步。

    • 如果 state!=0 则代表锁正在被其它线程占用,执行第三步。

  • 第二步:「判断队列中是否有线程在排队等待」

    • 如果不存在则直接将锁的所有者设置成当前线程,且更新状态 state 。

    • 如果存在就入队。

  • 第三步:「判断锁的所有者是不是当前线程」

    • 如果是则更新状态 state 的值。

    • 如果不是,线程进入队列排队等待。

「非公平锁」

 

 

  • 获取状态的 state 的值

    • 如果 state=0 即代表锁没有被其它线程占用,则设置当前锁的持有者为当前线程,该操作用 CAS 完成。

    • 如果不为0或者设置失败,代表锁被占用进行下一步。

  • 此时「获取 state 的值」

    • 如果是,则给state+1,获取锁

    • 如果不是,则进入队列等待

    • 如果是0,代表刚好线程释放了锁,此时将锁的持有者设为自己

    • 如果不是0,则查看线程持有者是不是自己