码上敲享录 > java面试题及答案大全 > 那么请谈谈 AQS 框架是怎么回事儿?

那么请谈谈 AQS 框架是怎么回事儿?

上一章章节目录下一章 2023-07-11已有221人阅读 评论(0)

AQS,即AbstractQueuedSynchronizer,是Java并发框架中用于实现同步器的基础框架。它提供了一种用于构建锁和同步器的工具,是ReentrantLock、CountDownLatch、Semaphore等并发工具的基石。


AQS使用一个FIFO(先进先出)的双向队列来实现等待队列,管理等待锁的线程。主要有以下几个关键组成部分和概念:


1. State(状态):

AQS的核心是一个整数类型的state变量,表示同步状态。可以根据具体的同步需求,将state用作不同的目的,比如表示锁的可用性、资源的数量等。


2. Node(节点):

每个线程会被封装成一个Node对象并加入到等待队列中。Node对象维护着线程的等待状态、线程属性以及后继节点等信息。


3. 等待队列:

等待队列是一个双向链表,用于存放等待获取锁的线程。被阻塞的线程会进入等待队列,而被唤醒的线程将被从等待队列中移出,然后尝试获取锁。


4. 独占模式和共享模式:

AQS支持两种同步方式,一种是独占模式,另一种是共享模式。


- 独占模式:一次只能有一个线程获取到锁,典型的示例是ReentrantLock。独占模式的同步器在同一时间内只允许一个线程获取锁,其他线程会被加入到等待队列中。

- 共享模式:多个线程可以同时获取到锁,典型的示例是Semaphore和CountDownLatch。共享模式的同步器允许多个线程同时访问,可以是共享资源的一部分。


5. CLH锁队列:

AQS内部使用CLH(Craig, Landin, and Hagersten)队列算法来实现等待队列。CLH队列使用了一种高效的自旋锁算法,避免了线程间频繁地阻塞和唤醒操作。


在使用AQS实现自定义同步器时,主要需要重写AQS的一些关键方法,包括`tryAcquire`、`tryRelease`、`tryAcquireShared`、`tryReleaseShared`等。这些方法用于控制线程的获取和释放锁的逻辑。


总而言之,AQS提供了一种灵活而高效的方式来构建自定义的锁和同步器。通过使用AQS的底层框架,开发者可以实现各种自定义的同步器,并在多线程环境中实现精确的并发控制。


0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交