首页后端开发JAVA【多线程系列】JUC 中的另一重要大杀器 AQS 抽象队列同步器

【多线程系列】JUC 中的另一重要大杀器 AQS 抽象队列同步器

时间2023-12-07 09:46:02发布访客分类JAVA浏览1348
导读:导读AQS 是什么、底层原理(独占模式、共享模式实现)AQS 变种 CLH 相比于原始 CLH 的改变版本及说明AQSAQS 全称是 AbstractQueuedSynchronizer,是 Java 并发包中的一个抽象类,用于构建各种同步...

导读

  • AQS 是什么、底层原理(独占模式、共享模式实现)
  • AQS 变种 CLH 相比于原始 CLH 的改变

版本及说明

AQS

  • AQS 全称是 AbstractQueuedSynchronizer,是 Java 并发包中的一个抽象类,用于构建各种同步器和锁,如 ReentrantLock、CountDownLatch、Semaphore 等。

核心思想

  • 基于 CAS 和 变种 CLH 实现对互斥资源的访问;访问互斥资源时,当互斥资源空闲时,通过 CAS 操作将互斥资源置为锁定状态,并将访问线程置为当前线程,当互斥资源被其他线程锁定时,通过变种 CLH 实现的逻辑 FIFO 队列实现对线程的阻塞以及资源释放时的唤醒机制。

结构

  • AQS 使用 int 成员变量 state 表示同步状态,通过内置的 FIFO 等待队列 来完成获取资源线程的排队工作。
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer
    implements java.io.Serializable {
    

    private transient volatile Node head;
    

    private transient volatile Node tail;
    

    // 使用 volatile 保证变量的可见性
    private volatile int state;


    protected final int getState() {
    
        return state;

    }


    protected final void setState(int newState) {
    
        state = newState;

    }


    // 提供 CAS 操作更新 state 的值
    protected final boolean compareAndSetState(int expect, int update) {
    
        // See below for intrinsics setup to support this
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);

    }

 }
    

state 状态

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 【多线程系列】JUC 中的另一重要大杀器 AQS 抽象队列同步器
本文地址: https://pptw.com/jishu/571789.html
经典面试题:多线程如何循环顺序打印 123 【多线程系列】基于 AQS 实现的同步器源码精讲(ReentrantLock、ReentrantReadWriteLock)

游客 回复需填写必要信息