AQS介绍

AQS介绍

 

AQS:

 

 

  • 前置知识:
  • 公平锁和非公平锁
  •  

    • 公平锁:锁被释放以后,先申请的线程先得到锁。性能较差一些,因为公平锁为了保证时间上的绝对顺序,上下文切换更频繁
    • 非公平锁:锁被释放以后,后申请的线程可能会先获取到锁,是随机或者按照其他优先级排序的。性能更好,但可能会导致某些线程永远无法获取到锁
  • 可重入锁
  •  

    • 也叫做递归锁,指的是线程可以再次获取自己的内部锁,比如一个线程获取到了对象锁,此时这个对象锁还没有释放,当其想再次获取这个对象锁的时候还是可以获取的,如果不可重入的话,会导致死锁。
  • 自旋思想
  •  

    • 当线程请求锁时,如果锁已经被其他线程持有,那么该线程会不断地重试获取锁,而不是被挂起等待,这种不断尝试获取锁的行为称为自旋

 

 

 

AQS是什么:(抽象的队列同步器)

同步状态(state):用volatile int变量表示共享资源的状态(即锁的状态),通过 CAS 操作保证原子性

等待队列:基于双向链表(双向队列)实现的 FIFO 队列,管理未获取资源的线程,节点(Node)包含线程引用、等待状态、前后驱指针

Image

 

  • 理解锁和同步器的关系
  •  

    • 锁,面向锁的使用者:定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可
    • 同步器,面向锁的实现者:Java并发大神DoungLee,提出了统一规范并简化了锁的实现,将其抽象出来,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等,是一切锁和同步组件实现的----公共基础部分

 

AQS框架关联的锁对象:

 

Image

Image(体系框架图)

Image(可以看到都是通过内部静态类来继承的AQS并实现)

 

 

AQS作用:

加锁会导致阻塞------有阻塞就需要排队,实现排队必然需要队列

  • 抢到资源的线程直接使用处理业务,抢不到资源的必然涉及一种排队等候机制。抢占失败的线程继续去等待(类似于银行办理窗口都满了,暂时没有受理窗口的顾客只能去候客区排队等待),但等候线程仍然保留获取锁的可能且获取锁流程仍在继续(候客区的顾客也在等着叫号,轮到了再去受理窗口办理业务)
  • 既然说到了排队等候机制,那么就一定会有某种队列形成,这样的队列是什么数据结构呢?
  •  

    • 如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中,这个队列就是AQS同步队列的抽象表现。它将要请求共享资源的线程及自身的等待状态封装成队列的节点对象(Node),通过CAS、自旋以及LockSupport.park()的方式,维护着state变量的状态,使其达到同步的状态。
    • Image
posted @ 2025-11-10 23:17  扛着音响去化缘  阅读(8)  评论(0)    收藏  举报
Sakana Widget右下角定位