• JUC——AQS原理分析


    AQS原理分析

    什么是AQS

    AQS在java源码中主要是指AbstractQueuedSynchronizer(抽象队列同步器)抽象类。
    它整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int类型变量表示持有锁的状态。

    为什么AQS是JUC的基石

    凡是实现锁机制的一些抽象接口,底层都是依靠AQS实现的
    在这里插入图片描述

    进一步理解锁和同步器的关系

    同步器:面向锁的实现者,java并发大神DougLee,提出同意规范并简化了锁的实现,将其抽象出来,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等。是一切锁和同步组件实现的——公共基础部分。

    AQS是干嘛的

    抢到资源的线程直接使用处理业务。抢不到资源的必然涉及一种排队等候机制。抢占资源失败的线程继续去等待(类似银行业务办理窗口都满了,暂时没有受理窗口的顾客只能去候客区排队等候),但等候线程仍然保留获取锁的可能且获取锁流程仍在继续(候客区的顾客也在等着叫号,轮到了再去受理窗口办理业务)。

    既然说到了排队等候机制,那么就一定会有某种队列形成,这样的队列是什么数据结构呢?(AQS)

    如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体(双向队列)实现的,将暂时获取不到锁的线入到队列中,这个队列就是AQS同步队列的抽象表现。它将要请求共享资源的线程及自身的等待状态封装成队列的结点对象(Node),通CAS、自旋以及LockSupport.park()的方式,维护state变量的状态,使并发达到同步的效果。
    在这里插入图片描述
    AQS使用一个volatle的int类型的成员变量来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作将每条要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改。
    在这里插入图片描述

    AQS中node节点属性说明

    static final class Node {
            /** Marker to indicate a node is waiting in shared mode */
            static final Node SHARED = new Node();
            /** Marker to indicate a node is waiting in exclusive mode */
            static final Node EXCLUSIVE = null;
    
            /** waitStatus value to indicate thread has cancelled */
            static final int CANCELLED =  1;
            /** waitStatus value to indicate successor's thread needs unparking */
            static final int SIGNAL    = -1;
            /** waitStatus value to indicate thread is waiting on condition */
            static final int CONDITION = -2;
            /**
             * waitStatus value to indicate the next acquireShared should
             * unconditionally propagate
             */
            static final int PROPAGATE = -3;
    
    		 volatile int waitStatus;
    
    		 volatile Node prev;
    		 
    		 volatile Node next;
    		 
    		 volatile Thread thread;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    源码解析以ReentrantLock为例,可以查看我的上一篇文章。

  • 相关阅读:
    SpringBoot启动类自动包扫描 三种方式
    插入排序算法的速度测试 [数据结构][Java]
    windows 环境 Redis 搭建 Sentinel( 哨兵模式集群 )
    深入理解算术运算符自加1与自减1
    IO作业:文件IO、fork,用父子进程拷贝一张图片,用文件IO实现,要求 子进程拷贝后半部分,父进程拷贝前半部分,按照cpu调度机制同时执行
    AHP层次分析法在水利中的实践
    【全开源】Java聚合跑腿系统对接云洋聚合跑腿系统源码低价快递小程序APP公众号源码
    (附源码)ssm某物流公司的员工信息管理系统 毕业设计 261625
    如何学习Java核心知识
    Spring精讲:什么是BeanFactory?(附源码)
  • 原文地址:https://blog.csdn.net/xiaowanziddd/article/details/126311078