首页 > 其他分享 >AQS

AQS

时间:2023-11-21 20:34:32浏览次数:22  
标签:AQS int 队列 protected 线程 资源

AQS

AQS抽象队列同步器

AQS利用一个FIFO双向队列(CLH队列的变体)来完成线程同步状态的管理,同步队列的节点包括以下属性(AQS的内部类):

image-20231120154123901

waitStatus的状态:

  • CANCELLED 1 表示线程获取锁的请求已经取消了
  • SIGNAL -1 表示线程已经准备好了,就等资源释放了
  • CONDITION -2 表示节点在等待队列中,节点线程等待唤醒
  • PROPAGATE -3 当前线程处于SHARE情况下,该字段才会使用

资源共享方式:

  • EXCLUSIVE 独占 如:ReentrantLock
  • SHARE 共享 如:Semaphore/CountDownLatch

AQS 使用 int 成员变量 state 表示同步状态,使用volatile关键字保证可见性和有序性,通过内置的FIFO队列来完成获取资源线程的排队工作:

image-20231120160950427

AQS使用了模板方法模式,自定义同步器的时候需要重写以下函数(并不一定全部实现):

//独占方式。尝试获取资源,成功则返回true,失败则返回false。
protected boolean tryAcquire(int)
//独占方式。尝试释放资源,成功则返回true,失败则返回false。
protected boolean tryRelease(int)
//共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
protected int tryAcquireShared(int)
//共享方式。尝试释放资源,成功则返回true,失败则返回false。
protected boolean tryReleaseShared(int)
//该线程是否正在独占资源。只有用到condition才需要去实现它。
protected boolean isHeldExclusively()

ReentrantLock

image-20231121170723275

ReentrantLock属于独占锁,其中包含内部类Sync实现了AQS,同时FairSyncNonfairSync继承于Sync分别实现了公平锁和非公平锁。

获取锁过程Lock

整体流程图如下:

image-20231121200611179

释放锁过程unLock

image-20231121201224241
未完待续~~~

参考资料

标签:AQS,int,队列,protected,线程,资源
From: https://www.cnblogs.com/wuzhimao/p/17847516.html

相关文章

  • 并发之AQS源码学习
    /****学习AbstractQueuedSynchronizer**1.state是aqs的重要属性,说明锁的使用次数*2.CustomAbstractQueuedSynchronizer,存在head与tail属性,所以其本身就是一个链表。并没有使用集合*3.双向链表(等待队列)*1.head永远都是伪节点(thead=null)*......
  • AQS源码分析-Condition
    在生产者消费者模型这篇文章中我们使用了ReentrantLock结合Condition实现生产者消费者模型,但我们对于ReentrantLock和Condition的工作原理并不了解,其内部的结构和源码级别实现就更加不了解了。比如在使用await方法的时候,为什么一定要用while判断条件,用if为什么不行呢?使用Condition......
  • AQS是什么?AbstractQueuedSynchronizer之AQS原理及源码深度分析
    文章目录一、AQS概述1、什么是AQS2、技术解释3、基本原理4、AQS为什么这么重要二、AQS数据结构1、AQS的结构2、ReentrantLock与AbstractQueuedSynchronizer3、AQS的state变量4、AQS的队列5、AQS的Node(1)Node的waitStatus(2)属性说明三、ReentrantLock的lock方法分析AQS源码1、类图2、......
  • aqs-shared
    上篇文章AQS源码分析-独占模式分析了AQS的结构以及独占模式下资源的获取与释放流程,啰嗦了AQS的基本结构和独占模式。这篇文章主要是探讨下AQS在共享模式下资源的获取与释放,同时比较下两种模式的差异(本文基于JDK11版本)。流程分析-获取资源这篇文章以CountDownLatch为例,和独占模......
  • aqs-exclusive
    我们在使用ReentrantLock进行加锁和释放锁时可能会有好奇,这种加锁释放锁的操作和synchronized有什么区别,所以就会去翻源码,一翻源码才发现这里面的知识别有洞天,因为涉及到并发编程最基础最难理解的部分,其中AbstractQueuedSynchronizer这个类是java.util.concurrent的核心,被称为AQS,......
  • 17-ReentrantLock和java中的aqs
    一、aqsAQS是AbstractQueuedSynchronizer的缩写,是一个用来构建锁和同步器的框架,是线程安全问题(原子性)的一种解决方案通过它可以实现很多不同类型的锁,例如ReentrantLock。主要内容:用state属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控......
  • Java并发之AQS
    一、AQS是什么AbstractQueuedSynchronizer抽象同步队列,简称AQS,它是Java并发包的根基,并发包中的锁就是基于AQS实现的。AQS是基于一个FIFO的双向队列,其内部定义了一个节点类Node,Node节点内部的SHARED用来标记该线程是获取共享资源时被阻挂起后放入AQS队列的,EXCLUSIVE用来标记......
  • 并发_AQS
            ......
  • 探索抽象同步队列 AQS
    by emanjusakafrom https://www.emanjusaka.top/archives/8 彼岸花开可奈何本文欢迎分享与聚合,全文转载请留下原文地址。前言AbstractQueuedSynchronizer抽象同步队列简称AQS,它是实现同步器的基础组件,并发包中锁的底层就是使用AQS实现的。大多数开发者可能永远不会直接使......
  • 并发编程系列-AQS
    AbstractQueuedSynchronizer(AQS)是一个抽象队列同步器,它用于构建依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器的框架。该类的目的在于提供基本功能的封装,适用于大多数需要使用单个原子int值表示同步状态的同步器。举例来说,ReentrantLock、Semaphore以及FutureTask等都是基于AQS......