首页 > 其他分享 >AQS

AQS

时间:2023-05-03 20:46:37浏览次数:27  
标签:Node 调用 AQS 队列 同步 线程 节点

AQS队列同步器

java.util.concurrent.locks.AbstractQueuedSynchronizer是一个同步器+阻塞锁的基本架构,用于控制加锁和释放锁,并在内部维护一个FIFO的线程等待队列,juc包下的锁,屏障等同步器多数是基于它实现的.

AQS每当有新的线程请求资源时,该线程就会进入一个等待队列(Waiter Queue),只有持有锁的线程释放资源后,该线程才能持有资源;

等待队列的实现方式为双向链表,线程会被包装在链表节点Node中

Sync Queue同步队列

同步队列是用来管理获取锁的线程

  • 同步队列,用来存放获取锁失败的线程,是一个双向链表,每个Node节点都有prev和next指针,指向前驱和后继节点。
  • 同步队列有两个属性head和tail,分别指向队列的头节点和尾节点。
  • 当一个线程获取锁失败后,会调用addWaiter方法,将自己包装成一个Node节点,并加入到同步队列的尾部,然后调用acquireQueued方法,进入自旋循环,等待被唤醒或者重新尝试获取锁。
  • 当一个线程释放锁后,会调用unparkSuccessor方法,唤醒同步队列中的头节点的后继节点,让其重新竞争锁。

Condition Queue条件队列

条件队列是管理等待条件的线程

  • 条件队列,用来存放调用await方法的线程,是一个单向链表,每个Node节点都有nextWaiter指针,指向下一个节点。
  • 条件队列有两个属性firstWaiter和lastWaiter,分别指向队列的第一个节点和最后一个节点。
  • 当一个线程已经获取了锁,但是需要等待某个条件满足时,会调用await方法,将自己包装成一个Node节点,并加入到条件队列的尾部,然后调用fullyRelease方法,释放已经获取的锁,并进入等待状态。
  • 当某个线程满足了条件,并调用了signal或者signalAll方法后,会调用doSignal或者doSignalAll方法,将条件队列中的头节点或者所有节点转移到同步队列中,让其重新竞争锁。

标签:Node,调用,AQS,队列,同步,线程,节点
From: https://www.cnblogs.com/z-dk/p/17369636.html

相关文章

  • Java多线程之---用 CountDownLatch 说明 AQS 的实现原理
    本文基于jdk1.8。CountDownLatch的使用前面的文章中说到了volatile以及用volatile来实现自旋锁,例如java.util.concurrent.atomic包下的工具类。但是volatile的使用场景毕竟有限,很多的情况下并不是适用,这个时候就需要synchronized或者各种锁实现了。今天就来说一下几......
  • AQS中的CyclicBarrier源码解析
    packagecn.com.pep;importjava.util.concurrent.BrokenBarrierException;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;/**......
  • 拿捏AQS,只需要搞定10个点!
    你是否也在面试中,被问到AQS,你是怎么回答的呢?是不是也像大部分人一样吱吱呜呜,面试官也不知道你到底要表达什么,然后,面试官就只是“嗯!嗯!嗯”,然后就没有然后了。这种表现说到底就是没有真正的掌握AQS,顶多也是背背八股文,并且还背的不够熟练。话又说回来,在绝大多数面试中,如果你也是想通过......
  • ReentrantLock与AQS
    参考:《对线面试官》 公平锁和非公平锁公平锁:在竞争环境下,先到的线程一定比后到的线程更快获取到锁非公平锁:先到的线程未必能够先获取锁 怎么实现可以使用先进先出队列 公平锁:竞争线程先入队,持有锁的线程释放锁后,唤醒队列的下一个线程去获取锁 (先排队) 非公平锁:竞......
  • 浅析ReentrantLock和AQS
          AQS的全称是AbstractQueuedSynchronizer,这是AQS框架的核心抽象类。ReentrantLock有三个内部类:Sync、NonfairSync、FairSync。FairSync代表了公平锁,NonfairSync代表了非公平锁,NonfairSync和FairSync都继承自Sync,Sync继承自AbstractQueuedSynchronizer。      AQ......
  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock之ReadLock读锁原理
    1 前言上节我们看了下ReentrantReadWriteLock读写锁的写锁的申请和释放过程,这节我们就来看下读锁的。2 线程读锁记录回顾一下之前的例子,在读写并发操作的时候,读取数据的时候加读锁:publicclassReentrantReadWriteLockTest{//声明一个读写锁privatestaticR......
  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock 读写锁怎么表示
    1 前言接下来我们来看看ReentrantReadWriteLock读写锁,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类,这个锁很重要,在很多开源的中间件中使用的非常广泛,很多场景使用它来减少并发操作中的锁冲突,提升并发能力。2  ReentrantReadWriteLock介绍ReentrantRead......
  • 【Java 并发】【九】【AQS】【七】Semaphore信号量底层机制原理
    1 前言接下来我们来看看Semaphore,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类。2  Semaphore是什么Semaphore,它是一个信号量,主要作用是用来控制并发中同一个时刻执行的线程数量,可以用来做限流器,或者流程控制器。在创建的时候会指定好它有多少个信号量......
  • 【Java 并发】【九】【AQS】【一】什么是AQS?为什么说它是JUC基础框架?
    1 前言这节我们来开始看AQS,这个东西可以说是搞Java的都知道的,本节会介绍一下AQS以及它提供的基本机制,后面再对AQS提供的每一个机制一个个深入的剖析。2  什么是AQS?(同步器基础框架)AQS叫做抽象队列同步器(AbstractQueuedSynchronizer),它是一个实现了同步器功能的基础框架,其......
  • 从ReentrantLock 看AQS源码
    ReentrantLock简介ReentrantLock意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁ReentrantLock与Synchronized的区别ReentrantLock支持公平锁和非公平锁,ReentrantLock内部有一个抽象内部类Sync集成于AQS,并且ReentrantLock就是通过Sync的具体实现(FairSync,NonfairSy......