AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理

 更新时间:2023年11月02日 09:03:21   作者:lane  
这篇文章主要介绍了为大家AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

AbstractQueuedSynchronizer

AbstractQueuedSynchronizer简称AQS,ReentrantLock,ReentrantReadWriteLock,CountDownLatch,Semaphore等等这些锁都是基于AQS实现的。

AQS核心主要实现了锁的状态的同步,队列排队、唤醒管理,锁的释放等底层功能。

主要基于state属性来控制锁的可用状态,通过维护一个CLH双向链表队列来管理并发获取锁的线程进行排队。

主要属性

/**
 * 队列头节点,延迟初始化,除了初始化时仅能通过setHead方法修改
 */
private transient volatile Node head;
/**
 * 队列尾节点,延迟初始化,仅通过enq方法修改添加等待节点
 */
private transient volatile Node tail;
/**
 * 同步器状态
 */
private volatile int state;

CLH队列节点属性

static final class Node {
    /** 共享锁标记 */
    static final Node SHARED = new Node();
    /** 独占锁标记 */
    static final Node EXCLUSIVE = null;
    /** 节点取消排队,可能由于超时或者中断 */
    static final int CANCELLED =  1;
    /** 当前节点的下个节点是阻塞或即将阻塞,当节点释放锁或取消时应该唤醒unpark下个节点 */
    static final int SIGNAL    = -1;
    /** 条件队列节点 */
    static final int CONDITION = -2;
    /**
     * 标识下个节点无条件传播(适用与共享锁)
     */
    static final int PROPAGATE = -3;
    //节点等待状态,0,CANCELLED,SIGNAL,CONDITION,PROPAGATE
    volatile int waitStatus;
    //上个节点
    volatile Node prev;
    //下个节点
    volatile Node next;
    //节点线程
    volatile Thread thread;
    /**
     * 共享锁时值为 SHARED
     * 条件队列时指向条件队列下个节点
     */
    Node nextWaiter;

主要流程

核心方法

//判断当前请求是否需要排队
public final boolean hasQueuedPredecessors() {
    Node t = tail;//尾节点
    Node h = head;//头节点
    Node s;
    return h != t &&//h==t时代表没有线程排队,见:java.util.concurrent.locks.AbstractQueuedSynchronizer#enq()
        ((s = h.next) == null || s.thread != Thread.currentThread());
        //
        //s.thread != Thread.currentThread() 判断第一个排队线程是否是当前线程
}

以上就是AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理的详细内容,更多关于AbstractQueuedSynchronizer锁状态管理的资料请关注脚本之家其它相关文章!

相关文章

  • SpringMVC集成FastJson使用流程详解

    SpringMVC集成FastJson使用流程详解

    如果你使用 Spring MVC 来构建 Web 应用并对性能有较高的要求的话,可以使用 Fastjson 提供的FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化速度
    2023-02-02
  • RabbitMQ消费端ACK NACK及重回队列机制详解

    RabbitMQ消费端ACK NACK及重回队列机制详解

    这篇文章主要为大家介绍了RabbitMQ消费端ACK NACK及重回队列机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringBoot实现Excel文件批量上传导入数据库

    SpringBoot实现Excel文件批量上传导入数据库

    这篇文章主要为大家详细介绍了SpringBoot实现Excel文件批量上传导入数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Java 使用Filter实现用户自动登陆

    Java 使用Filter实现用户自动登陆

    这篇文章主要介绍了Java 使用Filter实现用户自动登陆的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • Java Chassis3注册中心分区隔离技术解密

    Java Chassis3注册中心分区隔离技术解密

    这篇文章主要为大家介绍了Java Chassis3注册中心分区隔离技术解密,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 三种SpringBoot中实现异步调用的方法总结

    三种SpringBoot中实现异步调用的方法总结

    Spring Boot 提供了多种方式来实现异步任务,这篇文章主要为大家介绍了常用的三种实现方式,文中的示例代码讲解详细,需要的可以参考一下
    2023-05-05
  • SpringBoot中@EnableAsync和@Async注解的使用小结

    SpringBoot中@EnableAsync和@Async注解的使用小结

    在SpringBoot中,可以通过@EnableAsync注解来启动异步方法调用的支持,通过@Async注解来标识异步方法,让方法能够在异步线程中执行,本文就来介绍一下,感兴趣的可以了解一下
    2023-11-11
  • Springboot基础学习之初识SpringBoot

    Springboot基础学习之初识SpringBoot

    今天带大家学习Springboot基础知识,文中有非常详细的图文解说及代码示例,对正在学习java基础的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Java根据模板导出Excel报表并复制模板生成多个Sheet页

    Java根据模板导出Excel报表并复制模板生成多个Sheet页

    本文主要介绍了Java根据模板导出Excel报表并复制模板生成多个Sheet页的方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Java中将一个列表拆分为多个较小列表的三种不同方法

    Java中将一个列表拆分为多个较小列表的三种不同方法

    有时候我们需要将大集合按指定的数量分割成若干个小集合,这篇文章主要给大家介绍了关于Java中将一个列表拆分为多个较小列表的三种不同方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09

最新评论