详解AQS的7个同步组件

💡 原文中文,约18000字,阅读约需43分钟。
📝

内容提要

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类用于多线程间的协调通信,可以选择性通知等待线程。

➡️

继续阅读