AQS

2020-04-13  本文已影响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):共享模式释放
上一篇下一篇

猜你喜欢

热点阅读