JDK并发集合7:AQS总结(同步工具)

其他使用AQS的并发类

Semaphore

内部Sync继承AQS:

  • state为permit的数量
  • 用处:做限流

CountDownLatch

内部Sync继承AQS:

  • state保存次数
  • 使用共享锁实现
    • 调用await的线程阻塞在同步队列中
    • 调用countDown的线程CAS减少state,减到0的时候一次过唤醒所有等待线程

AQS总结

之前学习了ReentrantLock、ReentrantReadWriteLock以及上面的Semaphore和CountDownLatch,我们来总结一下AQS。

state

AQS里面使用一个int的状态变量state来保存同步状态,主要有两种形态:

  • 互斥锁:互斥锁状态下,只要原子更新state即可。重入的时候加一;
  • 互斥+共享:互斥加共享的情况下,即读写锁的情况,一半用作读锁,一半用作写锁。读线程和读线程不冲突。

队列

同步队列

AQS中维护着一个队列,等待锁的线程都包装为节点阻塞在队列中,等待锁释放后唤醒下一个排队的线程。

条件队列

AQS中还可以有一个用于实现条件锁的类ConditionObject,它维护了一个条件队列,给等待具体条件的线程来进行排队。当条件为真的时候,则会有线程调用signal把线程从条件队列转移到同步队列中,等待占有锁的线程释放锁后被唤醒。

模板方法

AQS中定义了一堆模板方法:

  • 获取互斥锁: acquire
  • 获取可中断互斥锁: acquireInterruptibly
  • 获取共享锁: acquireShared
  • 获取可中断共享锁: acquireSharedInterruptibly
  • 释放互斥锁: release
  • 释放共享锁: releaseShared

相应的,这些方法会调用下面的放啊,这些都是需要子类实现的方法:

  • 互斥模式下使用:尝试获取锁 tryAcquire
  • 互斥模式下使用:尝试释放锁 tryRelease
  • 共享模式下使用:尝试获取锁 tryAcquireShared
  • 共享模式下使用:尝试释放锁 tryReleaseShared
  • 如果当前线程独占着锁,返回true isHeldExclusively
comments powered by Disqus