这篇文章是 AQS 系列的最后一篇,第一篇,我们通过 ReentrantLock 公平锁分析了 AQS 的核心,第二篇的重点是把 Condition 说明白,同时也说清楚了对于线程中断的使用。这篇,我们的关注点是 AQS 最后的部分,AQS 共享模式的使用。有前两篇文章的铺垫,剩下的源码分析将会简单很多。本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier、Semaphore 的源码一起过一下。相对来说,如果读者有前面两篇文章的基础,这篇文章是简单很多,不过对于初学者来说,1 小时估计也是免不了的。
一行一行源码分析清楚 AbstractQueuedSynchronizer (二)
文章比较长,信息量比较大,建议在 pc 上阅读。文章标题是为了呼应前文,其实可以单独成文的,主要是希望读者看文章能系统看。
本文关注以下几点内容:
1、 深入理解 ReentrantLock 公平锁和非公平锁的区别
2、 深入分析 AbstractQueuedSynchronizer 中的 ConditionObject
3、 深入理解 Java 线程中断和 InterruptedException 异常
基本上本文把以上几点都说清楚了,我假设读者看过上一篇文章中对 AbstractQueuedSynchronizer 的介绍 ,当然如果你已经熟悉 AQS 中的独占锁了,那也可以直接看这篇。各小节之间基本上没什么关系,大家可以只关注自己感兴趣的部分。其实这篇文章的信息量很大,初学者估计至少要 1 小时才能看完,希望本文对得起大家的时间。
一行一行源码分析清楚 AbstractQueuedSynchronizer
在分析 Java 并发包 java.util.concurrent 源码的时候,少不了需要了解 AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是 Java 并发包的基础工具类,是实现 ReentrantLock、CountDownLatch、Semaphore、FutureTask 等类的基础。Google 一下 AbstractQueuedSynchronizer,我们可以找到很多关于 AQS 的介绍,但是很多都没有介绍清楚,因为大部分文章没有把其中的一些关键的细节说清楚。本文将从 ReentrantLock 的公平锁源码出发,分析下 AbstractQueuedSynchronizer 这个类是怎么工作的,希望能给大家提供一些简单的帮助。
SpringBoot 使用 @Transactional 无效
在 Spring Boot 引入的依赖 spring-boot-starter、spring-boot-starter-web 中都已经包含了对于 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 的依赖,框架会自动默认分别注入 DataSourceTransactionManager 或 JpaTransactionManager。我们不需要任何额外配置就可以用 @Transactional 注解进行事务的使用。
Spring Kafka 批量消费
Kafka 作为一个分布式发布订阅的消息系统,是目前最流行的消息队列之一,批量消费在现实业务场景中可以提高 kafka 消费吞吐量。Spring 框架可以使用 @KafkaListener
注解来实现消费端批量消费的功能。
Spring Retry 重试机制
在调用外部服务进行查询时,常常因为网络抖动、服务方限流等不可预知的一些因素造成查询失败。为了克服这些问题,引入了重试机制 Spring Retry.
PJAX加速站点访问
说起 PJAX,已是由来已久,在很多网站上经常会遇到。它通过 PushState + Ajax 技术,实现 HTML 页面局部刷新等功能,提供了一种极速的浏览体验。避免每次载入过多的重复资源,耗费额外加载时间,提升了网站的整体访问速度。最直观的体验就是音乐能全局播放了!