AQS是什么全称,它的工作原理和作用是什么?

2026-04-18 00:401阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计655个文字,预计阅读时间需要3分钟。

AQS是什么全称,它的工作原理和作用是什么?

概念:AQS是多线程同步器,它是JUC包中多个组件的底层实现,例如lock、countDownLatch、Semaphore等都用到了AQS。AQS提供了两种锁机制:分别是排队锁和共享锁。排队锁就是多个线程对同一资源进行加锁时,会按照一定的顺序排队等待,只有前一个线程释放锁后,下一个线程才能获得锁。共享锁允许多个线程同时访问同一资源,但每个线程都必须在访问完毕后释放锁。

概念:aqs是多线程同步器,他是juc包中多个组件的底层实现,比如lock、countDownLatch、Semaphore都用到了AQS,aqs提供了两种锁的机制分别是排他锁和共享锁。排它锁就是多个线程对同一共享资源进行竞争的时候,只允许一个线程访问,如lock中的ReentrantLock重入锁。共享锁也成为读锁,就是在多个线程在同一时刻获得这个锁的资源如CountDownLatch、Semaphore。

三个核心:

  • 互斥变量的设计:有一个status变量记录锁状态。0代表没有线程持有锁,大于等于1代表已经有线程持有锁资源。

  • 未竞争到锁的线程等待,以及竞争到锁资源释放锁之后的唤醒:未竞争到锁先看队列中有没有节点,没有aqs会生成两个节点(一个空节点状态为0且owner为null,一个放刚刚来的线程)。如果对列中有节点那么尾部插入。竞争到锁之后:重入问题、锁状态为恢复为0、唤醒队列中等待的线程。遍历队列如果这个节点的前一个节点是head,那么尝试加锁,并且将head指向自己,然后断开与前一节点的联系

  • 公平性和非公平性:如果是公平锁:看等待区(等待队列)有没有人,有代表锁肯定被占用了,你就去等待队列等着。调用的是hasQueuedPredecessors()方法去判断。如果是非公平锁:直接看锁标记位是不是0,然后尝试cas替换。

为什么aqs使用双向链表:

AQS对CLH进行了改进,后继获取锁的线程在经过有限次的轮询后,依旧获取不到锁将陷入阻塞。优点:减少轮询无效操作;缺点:后继线程Node在阻塞后无法感知前一个线程Node的状态,锁被释放时将无法主动醒来。于是AQS使用了双指针,在CLH的prev基础上增加了next。AQS维护了next指针,以便活跃线程释放锁后主动唤醒后续阻塞线程去竞争锁

AQS是什么全称,它的工作原理和作用是什么?

本文共计655个文字,预计阅读时间需要3分钟。

AQS是什么全称,它的工作原理和作用是什么?

概念:AQS是多线程同步器,它是JUC包中多个组件的底层实现,例如lock、countDownLatch、Semaphore等都用到了AQS。AQS提供了两种锁机制:分别是排队锁和共享锁。排队锁就是多个线程对同一资源进行加锁时,会按照一定的顺序排队等待,只有前一个线程释放锁后,下一个线程才能获得锁。共享锁允许多个线程同时访问同一资源,但每个线程都必须在访问完毕后释放锁。

概念:aqs是多线程同步器,他是juc包中多个组件的底层实现,比如lock、countDownLatch、Semaphore都用到了AQS,aqs提供了两种锁的机制分别是排他锁和共享锁。排它锁就是多个线程对同一共享资源进行竞争的时候,只允许一个线程访问,如lock中的ReentrantLock重入锁。共享锁也成为读锁,就是在多个线程在同一时刻获得这个锁的资源如CountDownLatch、Semaphore。

三个核心:

  • 互斥变量的设计:有一个status变量记录锁状态。0代表没有线程持有锁,大于等于1代表已经有线程持有锁资源。

  • 未竞争到锁的线程等待,以及竞争到锁资源释放锁之后的唤醒:未竞争到锁先看队列中有没有节点,没有aqs会生成两个节点(一个空节点状态为0且owner为null,一个放刚刚来的线程)。如果对列中有节点那么尾部插入。竞争到锁之后:重入问题、锁状态为恢复为0、唤醒队列中等待的线程。遍历队列如果这个节点的前一个节点是head,那么尝试加锁,并且将head指向自己,然后断开与前一节点的联系

  • 公平性和非公平性:如果是公平锁:看等待区(等待队列)有没有人,有代表锁肯定被占用了,你就去等待队列等着。调用的是hasQueuedPredecessors()方法去判断。如果是非公平锁:直接看锁标记位是不是0,然后尝试cas替换。

为什么aqs使用双向链表:

AQS对CLH进行了改进,后继获取锁的线程在经过有限次的轮询后,依旧获取不到锁将陷入阻塞。优点:减少轮询无效操作;缺点:后继线程Node在阻塞后无法感知前一个线程Node的状态,锁被释放时将无法主动醒来。于是AQS使用了双指针,在CLH的prev基础上增加了next。AQS维护了next指针,以便活跃线程释放锁后主动唤醒后续阻塞线程去竞争锁

AQS是什么全称,它的工作原理和作用是什么?