ReentrantLock锁机制

81 阅读2分钟
  • 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

构造函数

ReentrantLock里的默认构造函数是初始化的非公平锁,有参构造函数是根据传递的boolean值来初始化锁的类型

image.png

Sync

ReentrantLock内部定义了抽象类Sync并且继承了AbstractQueuedSynchronizer也就是AQS,公平锁和非公平锁都是继承了抽象类Sync,Sync的内部定义了抽象方法lock,具体的lock加锁的实现则根据不同的锁实现执行的不同逻辑。

image.png

FairSync

这是公平锁的实现类,里面重写了两个方法lock()跟tryAcquire(int acquires),在公平锁的lock方法也就是加锁方法内是通过后续方法进行顺序获取锁的逻辑,非公锁就不一样

image.png

NonfairSync

这是非公平锁的实现类,里面也重写了两个方法lock()跟tryAcquire(int acquires),实现逻辑跟公平锁有些区别,在lock加锁操作时是先通过cas操作直接尝试获取一次锁对象,如果没有获取到再执行跟公平锁一样的后续处理逻辑。

image.png

非公平锁在尝试获取到锁后会直接将当前线程指向到AOS的exclusiveOwnerThread,后续此线程对象执行需要处理的业务。

AOS是AQS的父类,获取到锁的线程对象会执行到这里的exclusiveOwnerThread

image.png

acquire

这个方法是公平锁中加锁时执行的方法,也是非公平锁第一次尝试没有获取到锁后执行的方法

image.png

tryAcquire

tryAcquire是尝试获取锁的操作,公平锁跟非公平锁都对它进行了实现,但是实现中唯一的差距只有一个判断

公平锁的实现

image.png

非公平锁的实现

image.png

公平锁比非公平锁多了一个方法的判断

!hasQueuedPredecessors()