zoukankan      html  css  js  c++  java
  • AQS简介

    AQS:全称AbstractQueueSynchronizer,抽象队列同步器,这个类在java.util.concurrent.locks包下
                它是一个底层同步工具类,比如CountDownLatch,Sammphore,ReentrantLock,ReentrantReadWriteLock等等都是基于AQS
                底层三个内容:
                    1.state(用于计数器)
                    2.线程标记(哪一个线程加的锁)
                    3.阻塞队列(用于存放阻塞线程)

    AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,如下图所示。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。

     J.U.C是基于AQS实现的,AQS是一个同步器,设计模式是模板模式。
    核心数据结构:双向链表 + state(锁状态)
    底层操作:CAS

          

    释放锁以及添加线程对于队列的变化

    添加节点

    当出现锁竞争以及释放锁的时候,AQS同步队列中的节点会发生变化,首先看一下添加节点的场景。


    这里会涉及到两个变化

    • 新的线程封装成Node节点追加到同步队列中,设置prev节点以及修改当前节点的前置节点的next节点指向自己
    • 通过CAS讲tail重新指向新的尾部节点

    释放锁移除节点

    head节点表示获取锁成功的节点,当头结点在释放同步状态时,会唤醒后继节点,如果后继节点获得锁成功,会把自己设置为头结点,节点的变化过程如下


    这个过程也是涉及到两个变化

    • 修改head节点指向下一个获得锁的节点
    • 新的获得锁的节点,将prev的指针指向null

    这里有一个小的变化,就是设置head节点不需要用CAS,原因是设置head节点是由获得锁的线程来完成的,而同步锁只能由一个线程获得,所以不需要CAS保证,只需要把head节点设置为原首节点的后继节点,并且断开原head节点的next引用即可

    参考:https://segmentfault.com/a/1190000017372067

  • 相关阅读:
    使用Kubeadm创建k8s集群之节点部署(三十一)
    Jmeter之Bean shell使用(二)
    Jmeter之Bean shell使用(一)
    Jmeter之JDBC Request使用方法(oracle)
    Jmeter调试工具---HTTP Mirror Server
    Jenkins快速上手
    Jmeter之逻辑控制器(Logic Controller)
    Jmeter属性和变量
    Jmeter之HTTP Request Defaults
    Jmeter之Http Cookie Manager
  • 原文地址:https://www.cnblogs.com/chx9832/p/12574625.html
Copyright © 2011-2022 走看看