主要观点总结
本文介绍了AQS(AbstractQueuedSynchronizer)的基本原理和实现方式,包括信号量、管程、AQS的核心特性、ReentrantLock的实现以及CountDownLatch的相关知识。文章以简洁明了的语言,详细解释了AQS如何用于构建锁和同步器,以及如何使用双向链表数据结构实现同步等待队列和条件等待队列。
关键观点总结
关键观点1: AQS简介
AQS是一个用来构建锁和同步器的抽象类,是Java中众多锁和并发工具的基础。掌握AQS的核心实现原理对于理解Java并发编程至关重要。
关键观点2: 信号量和管程
信号量和管程是操作系统中实现并发编程的两种重要技术。信号量是一种低级的同步工具,而管程是为了解决信号量在临界区的PV操作上的配对的麻烦而提出的并发编程方法。
关键观点3: AQS的核心特性
AQS维护了一个共享资源state和一个FIFO的等待队列,底层通过CAS机制保证了操作的原子性。AQS基于MESA模型实现,有两种队列:同步等待队列和条件等待队列。AQS还定义了两种资源获取方式:独占和共享。
关键观点4: ReentrantLock的实现原理
ReentrantLock是Java中常用的锁,其实现基于AQS。ReentrantLock有公平和非公平锁两种模式。在获取锁的过程中,主要通过自旋的方式等待竞争锁,如果获取失败,则将线程添加到等待队列中。
关键观点5: AQS为什么使用双向链表
AQS使用双向链表作为等待队列,主要是因为双向链表可以快速找到前置节点,支持在两端进行高效的操作,保证先进先出的顺序,实现一定的公平性。
关键观点6: CountDownLatch的实现
CountDownLatch是一个同步辅助类,允许一个或多个线程等待其他线程完成操作。CountDownLatch使用AQS来实现同步,通过设定一个计数器,当计数器到达0时,等待的线程才会被唤醒。
文章预览
作者 | 谢志豪 来源 | 码哥跳动 相信大家对于 AQS 都有所耳闻,AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器的抽象类,是 Java 中众多锁和并发工具的基础。 而在面试中,关于 AQS 的问题也是层出不穷,所以,掌握 AQS 的核心实现原理至关重要,希望大家在读完本篇文章都有所收获。 信号量和管程 在并发编程领域有几个核心概念: 互斥:只有一个线程能访问临界区。 临界资源:多个线程可以共享系统中的资源,但是临界资源在同一时刻只允许一个线程访问。 临界区:访问临界资源的代码即临界区。 管程和信号量是操作系统中实现并发编程的两种重要技术。 信号量:是一种低级的同步工具,是一个计数器,用于控制对共享资源的访问。信号量的值表示可用的资源数量。 主要包含共享变量 S、P 操作(申请资源)和 V 操作(释放资源)。P
………………………………