AQS(AbstractQueuedSynchronizer)的状态(State)是其实现同步控制的核心,它用一个int类型的变量来表示。这个状态对于不同的同步组件有不同的含义。例如,在ReentrantLock中,状态可以表示锁被持有的次数;在CountDownLatch中,状态可以表示计数器的当前值;而在Semaphore中,状态表示可用的信号量。
状态的工作原理
1、原子性更新: AQS使用CAS(比较并交换)操作来保证状态值的原子性更新,确保在多线程环境中的安全性。CAS操作涉及三个主要操作数:内存位置(在这里是状态变量)、预期原值和新值。只有当内存位置的当前值等于预期值时,才会将内存位置的内容替换为新值。
2、获取与释放同步状态: AQS提供了一系列用于获取和释放同步状态的方法,不同的同步组件会根据其具体需求来实现这些方法。例如,tryAcquire和tryRelease方法分别用于尝试获取和释放独占式的同步状态,而tryAcquireShared和tryReleaseShared方法用于共享式同步状态。
3、状态的含义与使用: 状态的具体含义根据使用AQS的同步组件的需求而定。组件通过重写AQS提供的方法来定义状态的使用逻辑。例如,对于独占锁,该状态可能表示持有锁的线程数;对于计数器或信号量,该状态表达当前可用资源的数量。
4、同步状态的转换: 同步组件通过调用AQS的方法来改变同步状态,以实现其同步逻辑。当状态改变引发线程的唤醒或阻塞时,AQS将负责进行线程管理,遵循先进先出(FIFO)的原则,从等待队列中唤醒或加入线程。
实例
以ReentrantLock为例,当线程尝试获取锁时,它会使用CAS操作尝试更新状态值从0变为1,表示锁被一个线程持有。如果该操作成功,锁的拥有权就被赋予了该线程。如果锁已经被持有(状态值非0),且当前线程是锁的持有者,则状态值会增加(重入次数加1)。释放锁时,线程会减少状态值。当状态值回到0时,表示锁被完全释放。
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!