ReentrantLock


# 一、AQS(AbstractQueuedSynchronizer) 当获得锁的线程需要等待某个条件时,会进入 condition 的等待队列,等待队列可以有多个。 当 condition 条件满足时,线程会从等待队列重新进入同步队列进行获取锁的竞争。 ReentrantLock 就是基于 AQS 实现的,如下图所示,ReentrantLock 内部有公平锁和⾮公平锁两种实 现,差别就在于新来的线程是否⽐已经在同步队列中的等待线程更早获得锁。 和 ReentrantLock 实现⽅式类似,Semaphore 也是基于 AQS 的,差别在于 ReentrantLock 是独占锁, Semaphore 是共享锁。 ReentrantLockn里面有一个内部类Sync,Sync继承 AQS(AbstractQueuedSynchronizer),添加锁和释放锁的⼤部分操作实际上都是在Sync中实现的。 它有公平锁FairSync和非公平锁NonfairSync两个子类。 ReentrantLock默认使用非公平锁,也可以通过构造器来显示的指定使用公平锁。

二、过程

1.非公平锁过程

线程A准备获取锁,发现state为0,cas成功将线程锁改为A,线程B进入时,state为1cas失败,进入等待队列。
线程A将锁释放,通知等待队列线程B获取锁,此时线程c进入发现state为0将所锁线程改为线程C,线程CAS失败继续等待。

2.公平锁过程

默认非公平锁 构造器传入参数
ReentrantLock lock = new ReentrantLock(true);
线程A获取锁发现state为0,cas成功将线程锁改为A,线程B进入时,state为1cas失败,进入等待队列。
线程A将锁释放,通知等待队列线程B获取锁,此时线程c进入发现state为0,且等待队列存在线程,进行队列排序。
线程B队列顺序为0且state为0,线程B获得锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值