diff --git a/docs/java/concurrent/aqs.md b/docs/java/concurrent/aqs.md index 8f45336ebbc..8abe72a08e1 100644 --- a/docs/java/concurrent/aqs.md +++ b/docs/java/concurrent/aqs.md @@ -106,10 +106,10 @@ AQS(`AbstractQueuedSynchronizer`)的核心原理图: AQS 使用 **int 成员变量 `state` 表示同步状态**,通过内置的 **FIFO 线程等待/等待队列** 来完成获取资源线程的排队工作。 -`state` 变量由 `volatile` 修饰,用于展示当前临界资源的获取情况。 +`state` 变量由 `volatile` 修饰,用于展示当前临界资源的获取情况。这里 `volatile` 的作用不仅仅是保证可见性,更重要的是通过 happens-before 规则(volatile 变量的写操作先行发生于后续的读操作)防止编译器和处理器对指令进行重排序,从而保证锁语义的正确性。 ```java -// 共享变量,使用volatile修饰保证线程可见性 +// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序 private volatile int state; ``` @@ -210,7 +210,7 @@ AQS 定义两种资源共享方式:`Exclusive`(独占,只有一个线程 | **并发度** | 同一时刻只有一个线程能获取到资源 | 同一时刻可以有多个线程同时获取到资源 | | **获取资源入口** | `acquire(int arg)` | `acquireShared(int arg)` | | **释放资源入口** | `release(int arg)` | `releaseShared(int arg)` | -| **需要重写的模板方法** | `tryAcquire(int)` / `tryRelease(int)` | `tryAcquireShared(int)` / `tryReleaseShared(int)` | +| **需要重写的模板方法** | `tryAcquire(int)` / `tryRelease(int)` | `tryAcquireShared(int)` / `tryReleaseShared(boolean)` | | **tryXxx 返回值** | `boolean`,`true` 表示获取/释放成功 | `int`(获取时),负数表示失败,0 表示成功但无剩余资源,正数表示成功且有剩余资源;`boolean`(释放时) | | **唤醒后继节点** | 释放资源时唤醒一个后继节点 | 获取资源成功后,如果还有剩余资源,会继续唤醒后续节点(传播唤醒) | | **Node 类型标识** | `Node.EXCLUSIVE`(`null`) | `Node.SHARED`(一个静态的 `Node` 实例) |