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锁状态管理的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot使用Redis实现消息队列的方法小结

    SpringBoot使用Redis实现消息队列的方法小结

    在应用中把Redis当成消息队列来使用已经屡见不鲜了,我想主要原因是当代应用十有八九都会用到 Redis,因此不用再引入其他消息队列系统,而且Redis提供了好几种实现消息队列的方法,用起来也简单,本文给大家介绍了SpringBoot使用Redis实现消息队列的方法小结
    2024-04-04
  • Spring Boot 接口加解密功能实现

    Spring Boot 接口加解密功能实现

    在我们日常的Java开发中,免不了和其他系统的业务交互,或者微服务之间的接口调用;如果我们想保证数据传输的安全,对接口出参加密,入参解密,这篇文章主要介绍了Spring Boot 接口加解密功能实现,需要的朋友可以参考下
    2023-04-04
  • Springboot @Validated和@Valid的区别及使用详解

    Springboot @Validated和@Valid的区别及使用详解

    这篇文章主要介绍了Springboot @Validated和@Valid的区别及使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 巧用Spring中的@Order进行排序

    巧用Spring中的@Order进行排序

    这篇文章主要介绍了巧用Spring中的@Order进行排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • maven私服搭建与使用教程

    maven私服搭建与使用教程

    在使用maven进行Java项目的开发过程中,难免会有些公共的私有库,这些库是不太方便放到中央仓库的,可以通过Nexus搭建一个私有仓库,这篇文章主要介绍了maven私服搭建与使用,需要的朋友可以参考下
    2023-03-03
  • IDEA中如何去掉Java方法注释后的空行

    IDEA中如何去掉Java方法注释后的空行

    本文介绍了如何在IntelliJIDEA中去掉Java方法注释后多余的空行,并提供了详细的操作步骤,通过修改设置,可以避免默认格式化过程中自动插入的空行,使Javadoc注释更加紧凑和清晰,符合个人或团队的代码规范
    2025-02-02
  • SpringBoot3集成ip2region实现离线IP查询方案

    SpringBoot3集成ip2region实现离线IP查询方案

    做后端开发,IP归属地查询绝对是高频刚需场景:用户访问日志埋点、地域权限风控、用户地域画像、站点访问统计,几乎处处都能用得上,本文给大家介绍了如何基于ip2region搭建的离线IP查询的方案,需要的朋友可以参考下
    2026-03-03
  • Java 实战项目锤炼之校园宿舍管理系统的实现流程

    Java 实战项目锤炼之校园宿舍管理系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+jsp+javaweb+mysql+ajax实现一个校园宿舍管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • try-cache-finally读取文件错误try-with-resources使用方法

    try-cache-finally读取文件错误try-with-resources使用方法

    这篇文章主要为大家介绍了try-cache-finally读取文件错误try-with-resources使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • MyBatisPlus的使用最全实例详解

    MyBatisPlus的使用最全实例详解

    MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,内置通用Mapper、Service及条件构造器,支持动态SQL、分页查询与注解配置,适用于单表操作,复杂SQL可手动编写,减少样板代码,优化开发体验
    2025-09-09

最新评论