zoukankan      html  css  js  c++  java
  • AQS

    AQS即队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。

    AQS使用了一个int成员变量表示同步状态。

    01

    AQS通过内置的FIFO双向队列来完成获取锁线程的排队工作


    同步器包含两个节点类型的应用,一个指向头节点,一个指向尾节点,未获取到锁的线程会创建节点线程安全(compareAndSetTail)的加入队列尾部。同步队列遵循FIFO,首节点是获取同步状态成功的节点。

    timg

    未获取到锁的线程将创建一个节点,设置到尾节点。如下图所示:

    03

    首节点的线程在释放锁时,将会唤醒后继节点。而后继节点将会在获取锁成功时将自己设置为首节点。如下图所示:

    04

    独占式/共享式锁获取

    • 独占式:有且只有一个线程能获取到锁,如:ReentrantLock。
    • 共享式:可以多个线程同时获取到锁,如:CountDownLatch
    独占式

    每个节点自旋观察自己的前一节点是不是Header节点,如果是,就去尝试获取锁。

    05

    独占式锁获取流程:

    06

    共享式:

    共享式与独占式的区别:

    07

    共享锁获取流程:

    08

  • 相关阅读:
    设计模式-观察者模式
    idea 生成 protobuf
    springboot @Autowride 注入空 调用时报Null空指针
    Netty 服务端创建过程
    git failed to push some refs to
    SPI simp
    Controller之statefulset
    Service
    Controller之deployment
    rabbitmq“ Login was refused using authentication mechanism PLAIN”
  • 原文地址:https://www.cnblogs.com/amunote/p/10328284.html
Copyright © 2011-2022 走看看