目录
- 1、锁和协作类的共同点:闸门
-
- 1.1 Semaphore和AQS的关系
- 1.2 AQS的职责
- 1.3 AQS三要素
-
- 1.3.1 State状态
- 1.3.2 等待队列
- 1.3.3 方法
1、锁和协作类的共同点:闸门
因为上面的那些协作类,他们有很多 工作都是类似的,所以如果能提取一个工具类,那么就可以直接用,对于ReentrantLock和Semaphore而言就可以屏蔽很多细节,只关注他们自己的业务逻辑就可以了
1.1 Semaphore和AQS的关系
sync是Semaphore的一个内部类,继承于AQS,ReentrantLock、CountDownLatch也是一样的,所以这些类和AQS是包含关系
1.2 AQS的职责
如果没有AQS,就需要每个协作工具自己实现:
- 同步状态的原子性管理,
- 线程的阻塞与解除阻塞,
- 队列的管理
在并发场景下,自己正确且高效实现这些内容,是相当有难度的,所以我们用AQS来帮我们把这些脏活累活都搞定,我们只关注业务逻辑就可以了
总结:有了AQS以后,构建协作类就方便多了
AQS是一个用于构建锁、同步器、协作工具类的工具类(工具)。有了AQS以后,更多的协作工具类都可以很方便的被写出来
- 并发包中多数类都和AQS相关
1.3 AQS三要素
1.3.1 State状态
- volatile state int
这里有具体的含义,他根据具体实现类的不同而不同
在Semaphore里,他表示 “剩余的许可证数量”,而在CountDownLatch中,表示"还需倒数的数量"
- AQS源码:
在ReentrantLock中,state用来表示锁的占有情况,state为0代表Lock不被任何线程所占有,state为1或大于1(可重入锁)表示被占有
1.3.2 等待队列
在队列中,head是目前已经拿到锁的线程,后面是阻塞的等待锁的线程
1.3.3 方法
第三个是期望协作工具类去实现的获取/释放等重要方法,这里的获取和释放方法,是利用AQS的协作工具类里最重要的方法,是由协作类自己去实现的,并且含义不相同