Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/java/concurrent/aqs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
```

Expand Down Expand Up @@ -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` 实例) |
Expand Down