先上一段源码,看了半天讲解,回头发现还是得看源码[cry]。
1 | /** |
AQS内部有一个核心状态为state
。所有通过AQS实现功能的类都是通过修改state的状态来操作线程的同步状态。比如在ReentrantLock
中,一个锁中只有一个state
状态,当state
为0时,代表所有线程没有获取锁,当state
为1时,代表有线程获取到了锁。通过是否能把state
从0设置成1,当然,设置的方式是使用CAS设置,代表一个线程是否获取锁成功。
AQS提供了操作state的方法
1 | int getState() |
Cas 真是神奇。
AQS内部维护一个线程的队列。队列由内部的节点组成。
队列的节点为Node
,节点分为SHARED
和EXCLUSIVE
分别时共享模式的节点和独占模式的节点。
节点的等待状态为waitStatus
- CANCELLED(1):取消状态,当线程不再希望获取锁时,设置为取消状态
- SIGNAL(-1):当前节点的后继者处于等待状态,当前节点的线程如果释放或取消了同步状态,通知后继节点
- CONDITION(-2):等待队列的等待状态,当调用signal()时,进入同步队列
- PROPAGATE(-3):共享模式,同步状态的获取的可传播状态
- 0:初始状态
同样需要使用CAS的方式进行设置。
下面通过ReentrantLock
和ReentrantReadWriteLock
来解析AQS的独占模式和共享模式。