从ReentrantLock看AQS

date
Jun 1, 2022
slug
从ReentrantLock看AQS
status
Published
tags
Java
多线程
summary
type
Post

ReentrantLock

  • Sync extends AbstractQueuedSynchronizer
  • NonfairSync extends Sync
  • FairSync extends Sync

AbstractQueuedSynchronizer(AQS)

  • state: 线程是否被线程占用,初始化值为0
  • Node : 线程队列,CLF链表的变种,双向链表
  • 实现的AbstractQueuedSynchronizer 接口用于设置当前锁被哪个线程所占有或者独占
  • state 重入一次+1,解锁同理,解锁一次-1

加锁流程:

  1. acquire()tryAcquire()
  1. tryAcquire()成功,设置当前节点为头节点(头结点为虚节点,无实际数据)
  1. tryAcquire()失败,通过addWaiter(Node mode)入队,成为Node里面的tail,然后通过acquireQueued(final Node node, int arg)自旋尝试获取锁。
  1. acquireQueued(final Node node, int arg)打破自旋的条件是:当前Node的前置节点是头结点,并且当前节点获取锁成功
  1. acquireQueued(final Node node, int arg)获取锁失败会通过条件判断是否需要阻塞当前线程避免一直自旋耗费CPU资源
 

© Ryan Tang 2021 - 2025