AQS
2020-04-13 本文已影响0人
策马踏清风
AbstractQueuedSynchronizer
维护了一个State
值和一个FIFO
等待队列的框架。可以用来实现阻塞锁和同步器,ReentrantLock
等锁就是基于AQS
实现的
State
共享资源变量,int
类型。访问方式有
getState()
setState(int newState)
-
compareAndSetState(int expect, int update)
: 依赖于Unsafe
的compareAndSwapInt()
方法
三种方式都是原子操作。
AQS将大部分的同步逻辑均已经实现好,继承的自定义同步器只需要实现state的获取(acquire)和释放(release)的逻辑代码就可以,主要包括下面方法:
-
tryAcquire(int)
:独占方式。尝试获取资源,成功则返回true,失败则返回false。 -
tryRelease(int)
:独占方式。尝试释放资源,成功则返回true,失败则返回false。 -
tryAcquireShared(int)
:共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。 -
tryReleaseShared(int)
:共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。 -
isHeldExclusively()
:该线程是否正在独占资源。只有用到condition才需要去实现它。
CLH队列(FIFO)
使用内部类Node
来实现,其中维护一个变量waitStatus
代表当前节点代表状态
-
acquire(int arg)
:独占模式获取资源 -
release(int arg)
:独占模式释放资源 -
acquireShared(int arg)
:共享模式获取 -
releaseShared(int arg)
:共享模式释放