- 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
构造函数
ReentrantLock里的默认构造函数是初始化的非公平锁,有参构造函数是根据传递的boolean值来初始化锁的类型
Sync
ReentrantLock内部定义了抽象类Sync并且继承了AbstractQueuedSynchronizer也就是AQS,公平锁和非公平锁都是继承了抽象类Sync,Sync的内部定义了抽象方法lock,具体的lock加锁的实现则根据不同的锁实现执行的不同逻辑。
FairSync
这是公平锁的实现类,里面重写了两个方法lock()跟tryAcquire(int acquires),在公平锁的lock方法也就是加锁方法内是通过后续方法进行顺序获取锁的逻辑,非公锁就不一样
NonfairSync
这是非公平锁的实现类,里面也重写了两个方法lock()跟tryAcquire(int acquires),实现逻辑跟公平锁有些区别,在lock加锁操作时是先通过cas操作直接尝试获取一次锁对象,如果没有获取到再执行跟公平锁一样的后续处理逻辑。
非公平锁在尝试获取到锁后会直接将当前线程指向到AOS的exclusiveOwnerThread,后续此线程对象执行需要处理的业务。
AOS是AQS的父类,获取到锁的线程对象会执行到这里的exclusiveOwnerThread
acquire
这个方法是公平锁中加锁时执行的方法,也是非公平锁第一次尝试没有获取到锁后执行的方法
tryAcquire
tryAcquire是尝试获取锁的操作,公平锁跟非公平锁都对它进行了实现,但是实现中唯一的差距只有一个判断
公平锁的实现
非公平锁的实现
公平锁比非公平锁多了一个方法的判断
!hasQueuedPredecessors()