文章字数: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):共享模式释放