• AQS介绍


    AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器.

    AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的同步器,比如我们提到的ReentrantLock,Semaphore,ReentrantReadWriteLock.

    AQS内部使用了一个volatile修饰的变量state来作为资源的标识。AQS 使用 CAS 对该state变量进行原子操作实现对其值的修改。同时定义了几个获取和改变state的protected方法,子类可以覆盖这些方法来实现自己的逻辑。

    private volatile int state;//共享变量,使用volatile修饰保证线程可见性
    
    • 1
    getState()
    setState()
    compareAndSetState()
    
    • 1
    • 2
    • 3

    这三种操作均是原子操作,其中compareAndSetState的实现依赖于Unsafe的compareAndSwapInt()方法。

    AQS类本身实现的是一些排队和阻塞的机制,比如具体线程等待队列的维护(如获取资源失败入队/唤醒出队等)。它内部使用了一个先进先出(FIFO)的双端队列,并使用了两个指针head和tail用于标识队列的头部和尾部。

    AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
    在这里插入图片描述

    AQS定义了两种资源共享方式:
    (1)独占(Exclusive)
    对于一个资源在同一时刻只有一个线程能执行,如 ReentrantLock。又可分为公平锁和非公平锁。
    公平锁 :按照线程在队列中的排队顺序,先到者先拿到锁
    非公平锁 :当线程要获取锁时,先通过两次 CAS 操作去抢锁,如果没抢到,当前线程再加入到队列中等待唤醒。
    (2)共享(share)
    多个线程可同时对一个资源执行,如 Semaphore/CountDownLatch。

    AQS的设计是基于模板方法模式的,它有一些方法必须要子类去实现的。主要有:
    tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false
    tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false
    tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源
    tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false
    isHeldExclusively():该线程是否正在独占资源。只有用到condition才需要去实现它。

  • 相关阅读:
    MybatisPlus学习笔记
    数学建模学习(104):线性回归和多元回归【补充版】
    Jenkins--基础--6.1--Pipeline--介绍
    前端工程化工具系列(七)—— PNPM(v9.2.0):高性能的 NPM 替代品
    【我的OpenGL学习进阶之旅】收集的3D渲染技术之UVMap和Mesh相关资料
    E签宝面试题
    栈和队列(c++)
    Pytorch实现的LSTM、RNN模型结构
    读书笔记 |余华 | 文城
    洛谷 P3808 【模板】AC 自动机(简单版)
  • 原文地址:https://blog.csdn.net/qq_45968950/article/details/127753458