Java 中 AQS 的核心方法有哪些?

· 约 4 分钟读完 · 第 78 / 274 章

推荐答案

在 Java 中,AQS(AbstractQueuedSynchronizer)的核心方法包括:

  1. acquire(int arg):独占模式下获取锁,如果获取失败,线程会进入等待队列。
  2. release(int arg):独占模式下释放锁,并唤醒等待队列中的线程。
  3. acquireShared(int arg):共享模式下获取锁,如果获取失败,线程会进入等待队列。
  4. releaseShared(int arg):共享模式下释放锁,并唤醒等待队列中的线程。
  5. tryAcquire(int arg):尝试在独占模式下获取锁,成功返回 true,失败返回 false。
  6. tryRelease(int arg):尝试在独占模式下释放锁,成功返回 true,失败返回 false。
  7. tryAcquireShared(int arg):尝试在共享模式下获取锁,成功返回非负值,失败返回负值。
  8. tryReleaseShared(int arg):尝试在共享模式下释放锁,成功返回 true,失败返回 false。
  9. isHeldExclusively():判断当前线程是否独占持有锁。

本题详细解读

acquire(int arg)

  • 作用:独占模式下获取锁。如果当前线程成功获取锁,则继续执行;否则,线程会被放入等待队列中,直到获取到锁。
  • 实现:内部调用 tryAcquire(int arg) 方法尝试获取锁,如果失败则调用 addWaiter(Node.EXCLUSIVE) 将线程加入等待队列,并通过 acquireQueued(Node node, int arg) 方法自旋等待。

release(int arg)

  • 作用:独占模式下释放锁。释放锁后,会唤醒等待队列中的下一个线程。
  • 实现:内部调用 tryRelease(int arg) 方法尝试释放锁,如果成功则调用 unparkSuccessor(Node node) 方法唤醒等待队列中的下一个线程。

acquireShared(int arg)

  • 作用:共享模式下获取锁。如果当前线程成功获取锁,则继续执行;否则,线程会被放入等待队列中,直到获取到锁。
  • 实现:内部调用 tryAcquireShared(int arg) 方法尝试获取锁,如果失败则调用 doAcquireShared(int arg) 方法将线程加入等待队列并自旋等待。

releaseShared(int arg)

  • 作用:共享模式下释放锁。释放锁后,会唤醒等待队列中的线程。
  • 实现:内部调用 tryReleaseShared(int arg) 方法尝试释放锁,如果成功则调用 doReleaseShared() 方法唤醒等待队列中的线程。

tryAcquire(int arg)

  • 作用:尝试在独占模式下获取锁。通常由子类实现,用于自定义同步逻辑。
  • 返回值:成功返回 true,失败返回 false。

tryRelease(int arg)

  • 作用:尝试在独占模式下释放锁。通常由子类实现,用于自定义同步逻辑。
  • 返回值:成功返回 true,失败返回 false。

tryAcquireShared(int arg)

  • 作用:尝试在共享模式下获取锁。通常由子类实现,用于自定义同步逻辑。
  • 返回值:成功返回非负值,失败返回负值。

tryReleaseShared(int arg)

  • 作用:尝试在共享模式下释放锁。通常由子类实现,用于自定义同步逻辑。
  • 返回值:成功返回 true,失败返回 false。

isHeldExclusively()

  • 作用:判断当前线程是否独占持有锁。通常由子类实现,用于自定义同步逻辑。
  • 返回值:如果当前线程独占持有锁,则返回 true,否则返回 false。

这些方法是 AQS 的核心方法,提供了同步器的基本功能,开发者可以通过继承 AQS 并实现这些方法来创建自定义的同步器。