其他分享
首页 > 其他分享> > 从零写一个基于 AQS 实现的 Lock(一)

从零写一个基于 AQS 实现的 Lock(一)

作者:互联网

AQS

gitee 地址

https://gitee.com/haohaos/aqs

首先考虑 AQS 解决了什么?也就是它能用来做什么?

java.util.concurrent 包下存在很多的并发工具类都是基于 AQS 实现的,例如 ReentrantLock,CountDownLatch。

在并发场景下锁的应用是最多的。但是 synchronized 在一些场景下显的太重了。所以可以考虑使用 Lock 的实现类,例如 ReentrantLock 来实现锁机制。

下面以一个 Lock 的视角来学习 AQS 是怎么实现的。解决了什么问题。

1.0

传统 Java 锁 synchronized 通过对对象的抢占来实现锁。

Object o = new Object();
synchronized(o){
  // doSomething
}

在 AQS 中通过对一个 int 类型的变量 state 通过抢占(加,减)来实现锁。

在这里插入图片描述

2.0

一个线程尝试获取锁如果获取的到就执行,获取不到就阻塞并放入队列等待调度。

在这里插入图片描述

中间全为代码片段,完整代码放到文章 2.0 最后

在这里插入图片描述

下面思考几个场景:

思考问题,解决问题: