2020-09-26

.+
AQS学习记录day1
//应用示例
// 实例化一个公平锁
ReentrantLock reentrantLock = new ReentrantLock(true);
reentrantLock.lock();
System.out.println(“业务逻辑代码块”);
reentrantLock.unlock();

原理:
公平锁:
ReentrantLock 类中存在一个属性sync,这个属性是ReentrantLock的一个内部类,继承了AbstractQueuedSynchronizer(AQS)。
AQS的结构:
±-----+ prev ±----+ ±----+
head | | <---- | | <---- | | tail
±-----+ ±----+ ±----+
volatile Node prev; // 队列
private transient volatile Node head; //队列头
private transient volatile Node tail; // 队列尾
private volatile int state; // 同步状态
// 其余属性。。。

当第一个线程执行时,state默认值为0,cas执行成功,将state改为1,然后继续执行业务代码。
当第二个线程执行时,此时state=1,cas失败,进入添加队列逻辑:
(只说结果)给head赋值,head = new node(),head的nex指向tail;给tail赋值,tail的prve指向head。
死循环获取锁,当获取到锁时,第一次循环,将当前这个node置为head,当前,原来头的node对象next的置为null(方便GC)。再次循环时,出 lock,执行业务代码块。
第三个线程执行时(若第二个线程仍锁资源未释放),cas失败,进入添加队列逻辑:
给当前node的prve和next赋值,给当前node的prve指向的node的next赋值,并将当前线程park。
非公平锁:
第一次进入时,cas竞争锁资源,竞争失败时,进入公平锁逻辑,排队等待。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值