AQS

2019-02-10  本文已影响3人  SlowGO

什么是AQS?

AQS(Abustact Queued Synchronizer 抽象队列化同步器)是用来为Java的并发同步组件提供统一的底层支持,例如 ReentrantLock, CountdowLatch 都是基于 AQS 实现的。

AQS有2个重要组成部分:

  1. state 同步状态,int 类型
  2. 一个同步队列

当一个线程尝试获取锁时,如果已经被占用,此线程就作为一个节点添加到队尾,对头是成功获取锁的节点,对头释放锁后,会唤醒后面的节点,并出队。

资源共享方式

AQS定义了2种共享方式:

  1. 独占
  2. 共享

获取锁和是否锁的流程:

调用获取方法,如果成功则返回,否则构造node节点加入到队尾,以自旋的方式判断是否可以成为头节点,如果不能,就进入等待状态。

调用释放方法,获取当前节点的下一个节点,唤醒后面的节点。

在细节上2中方式有一些差异:

  1. 独占锁中 state 为,代表一次只能一个线程执行,而在共享锁中 state > 1,同时可以有多个线程成功获取同步状态。
  2. 释放锁时,独占锁只唤醒后面的那一个节点,因为 state 为 1,叫醒一个就够了,而共享锁会唤醒后面所有节点,因为 state > 1,把后面的都唤醒,至于哪些线程能获取同步状态就看他们自己的了。
上一篇下一篇

猜你喜欢

热点阅读