文章字数:459,阅读全文大约需要1分钟
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)
:共享模式释放