AQS

作者: SlowGO | 来源:发表于2019-02-10 10:14 被阅读3次

    什么是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,把后面的都唤醒,至于哪些线程能获取同步状态就看他们自己的了。

    相关文章

      网友评论

          本文标题:AQS

          本文链接:https://www.haomeiwen.com/subject/egpteqtx.html