什么是AQS

AQS

AQS 它是 J.U.C 这个包里面非常核心的一个抽象类,它为多线程访问共享资源提供了一个队列同步器。在 J.U.C 这个包里面,很多组件都依赖 AQS 实现线程的同步和唤醒,比如 Lock、Semaphore、 CountDownLatch 等等

AQS 内部由两个核心部分组成:
  • 一个 volatile 修饰的 state 变量,作为一个竞态条件
  • 用双向链表结构维护的 FIFO 线程等待队列
它的具体工作原理是,多个线程通过对这个 state 共享变量进行修改来实现竞态条件, 竞争失败的线程加入到 FIFO 队列并且阻塞,抢占到竞态资源的线程释放之后,后续的线程按照 FIFO 顺序实现有序唤醒。
什么是AQS_第1张图片

AQS 里面提供了两种资源共享方式:

  • 一种是独占资源,同一个时刻只能有一个线程获得竞态资源。比如 ReentrantLock 就是使用这种方式实现排他锁
  • 另一种是共享资源,同一个时刻,多个线程可以同时获得竞态资源。CountDownLatch或者 Semaphore 就是使用共享资源的方式,实现同时唤醒多个线程。

你可能感兴趣的:(java面试题,java,开发语言)