跳到主要内容

简述AQS 支持两种同步方式 ?

参考答案:

AQS(AbstractQueuedSynchronizer)是Java中的一个核心同步工具类,它提供了一种基于FIFO队列的阻塞锁和相关的同步器框架。AQS支持两种主要的同步方式:独占模式(Exclusive mode)和共享模式(Shared mode)。

  1. 独占模式(Exclusive mode):

    • 在独占模式下,同一时刻只有一个线程可以获得同步状态,其他线程必须等待。这种模式通常用于实现独占锁,如ReentrantLock。
    • 当一个线程尝试以独占方式获取同步状态时,会调用AQS的tryAcquire(int arg)方法。如果该方法成功返回true,表示该线程成功获得了同步状态;如果返回false,表示获取同步状态失败,该线程可能会被加入到等待队列中等待。
  2. 共享模式(Shared mode):

    • 在共享模式下,多个线程可以同时获得同步状态,允许多线程并发访问。这种模式通常用于实现信号量(Semaphore)、倒计时锁存器(CountDownLatch)和循环栅栏(CyclicBarrier)等。
    • 当一个线程尝试以共享方式获取同步状态时,会调用AQS的tryAcquireShared(int arg)方法。如果该方法成功返回非负数,表示该线程成功获取了一定数量的共享资源;如果返回负数,表示获取共享资源失败,该线程可能会被加入到等待队列中等待。

AQS通过内部维护一个状态信息(state)来管理同步状态,并通过getState、setState和compareAndSetState等方法来操作这个状态信息。使用者可以通过继承AQS并重写指定的方法来实现自定义的同步组件,然后将AQS组合在自定义同步组件的实现中,并调用其模板方法来实现同步功能。

以上是对AQS支持的两种同步方式的简要描述。需要注意的是,这两种模式并不是互斥的,一个同步器可以同时支持独占模式和共享模式,但具体实现时需要根据具体需求进行选择和设计。