推荐答案
在 Java 中,AQS(AbstractQueuedSynchronizer)的核心方法包括:
acquire(int arg):独占模式下获取锁,如果获取失败,线程会进入等待队列。release(int arg):独占模式下释放锁,并唤醒等待队列中的线程。acquireShared(int arg):共享模式下获取锁,如果获取失败,线程会进入等待队列。releaseShared(int arg):共享模式下释放锁,并唤醒等待队列中的线程。tryAcquire(int arg):尝试在独占模式下获取锁,成功返回 true,失败返回 false。tryRelease(int arg):尝试在独占模式下释放锁,成功返回 true,失败返回 false。tryAcquireShared(int arg):尝试在共享模式下获取锁,成功返回非负值,失败返回负值。tryReleaseShared(int arg):尝试在共享模式下释放锁,成功返回 true,失败返回 false。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 并实现这些方法来创建自定义的同步器。