AQS
2019-02-10 本文已影响3人
SlowGO
什么是AQS?
AQS(Abustact Queued Synchronizer 抽象队列化同步器)是用来为Java的并发同步组件提供统一的底层支持,例如 ReentrantLock, CountdowLatch
都是基于 AQS 实现的。
AQS有2个重要组成部分:
- state 同步状态,int 类型
- 一个同步队列
当一个线程尝试获取锁时,如果已经被占用,此线程就作为一个节点添加到队尾,对头是成功获取锁的节点,对头释放锁后,会唤醒后面的节点,并出队。
资源共享方式
AQS定义了2种共享方式:
- 独占
- 共享
获取锁和是否锁的流程:
- 获取锁
调用获取方法,如果成功则返回,否则构造node节点加入到队尾,以自旋的方式判断是否可以成为头节点,如果不能,就进入等待状态。
- 释放锁
调用释放方法,获取当前节点的下一个节点,唤醒后面的节点。
在细节上2中方式有一些差异:
- 独占锁中 state 为,代表一次只能一个线程执行,而在共享锁中 state > 1,同时可以有多个线程成功获取同步状态。
- 释放锁时,独占锁只唤醒后面的那一个节点,因为 state 为 1,叫醒一个就够了,而共享锁会唤醒后面所有节点,因为 state > 1,把后面的都唤醒,至于哪些线程能获取同步状态就看他们自己的了。