Java并发编程 之AQS实现原理

AbstractQueuedSynchronizer: 抽象队列同步器。
Java并发包下的所有同步类都是基于这个类来实现的。
在这里插入图片描述
ReentrantLock lock = new ReentrantLock(); // 非公平锁
ReentrantLock lock = new ReentrantLock(true); // 公平锁
// 多个线程过来,都尝试加锁
lock.lock();
// 执行代码
lock.unlock();

AQS加锁过程:

  1. 线程1、线程2同时执行 lock.lock() 进行加锁。
  2. 同时使用CAS更新AQS中state的值为1,假如线程1更新成功,将加锁线程的值设置为线程1;此时线程2更新state失败,加锁失败,进入等待队列。
  3. 线程1执行完后释放锁,会将state值设置为0,同时会唤醒等待队列中的线程来进行加锁操作。
  4. 等待队列中的线程想要进行加锁操作,也要通过CAS更新state值为1方式进行加锁的,如果这时一个线程也正在CAS更新state值进行加锁,并且更新state值为1成功加锁,等待队列里的线程会更新state值失败加锁失败,再次进入等待队列,体现了AQS默认实现是非公平锁。
  5. 想要实现公平锁,当一个线程在加锁的时候,如果等待队列不为空,直接进入等待队列排队加锁。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值