AQS

作者: 策马踏清风 | 来源:发表于2020-04-13 10:22 被阅读0次

    AbstractQueuedSynchronizer维护了一个State值和一个FIFO等待队列的框架。可以用来实现阻塞锁和同步器,ReentrantLock等锁就是基于AQS实现的

    State

    共享资源变量,int类型。访问方式有

    1. getState()
    2. setState(int newState)
    3. compareAndSetState(int expect, int update): 依赖于UnsafecompareAndSwapInt()方法

    三种方式都是原子操作。
    AQS将大部分的同步逻辑均已经实现好,继承的自定义同步器只需要实现state的获取(acquire)和释放(release)的逻辑代码就可以,主要包括下面方法:

    1. tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false。
    2. tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false。
    3. tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
    4. tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。
    5. isHeldExclusively():该线程是否正在独占资源。只有用到condition才需要去实现它。

    CLH队列(FIFO)

    使用内部类Node来实现,其中维护一个变量waitStatus代表当前节点代表状态

    1. acquire(int arg):独占模式获取资源
    2. release(int arg):独占模式释放资源
    3. acquireShared(int arg):共享模式获取
    4. releaseShared(int arg):共享模式释放

    相关文章

      网友评论

          本文标题:AQS

          本文链接:https://www.haomeiwen.com/subject/wvowmhtx.html