详解AQS的7个同步组件
内容提要
J.U.C下的AQS子包类支持排它锁和共享锁模式,内部维护了一个CLH队列,支持CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、Condition、FutureTask等同步组件,可以控制有限访问的资源,实现多线程之间相互等待,可以重置计数器,支持设置等待超时。ReentrantLock与synchronized有可重入性、锁的实现、性能的区别、功能区别,ReentrantLock独有的功能有指定公平锁、提供Condition类、提供中断等待锁的机制,synchronized的优势有不用手动释放锁、JVM生成线程转储时能够锁定信息、可以在所有JVM版本中工作,ReentrantReadWriteLock可以避免写锁饥饿。
关键要点
-
AQS全称为Abstract Queued Synchronizer,是J.U.C下的类。
-
AQS设计使用Node实现FIFO队列,利用int类型表示状态。
-
AQS支持排它锁和共享锁模式,子类通过继承管理状态。
-
AQS内部维护CLH队列,线程获取锁失败时会阻塞自己。
-
AQS的同步组件包括CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、Condition、FutureTask等。
-
CountDownLatch用于阻塞线程,直到计数器为0。
-
Semaphore控制并发线程数,提供acquire和release方法。
-
CyclicBarrier允许一组线程相互等待,直到到达公共屏障点。
-
ReentrantLock是可重入锁,具有公平锁和非公平锁的选择。
-
ReentrantLock与synchronized在可重入性、实现、性能和功能上有区别。
-
ReentrantReadWriteLock避免写锁饥饿,允许多个读锁同时存在。
-
StampedLock提供写、读、乐观读三种模式,提升程序吞吐量。
-
Condition类用于多线程间的协调通信,可以选择性通知等待线程。