14 | Lock和Condition(上):隐藏在并发包中的管程
并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。这两大问题,管程都是能够解决的。Java SDK并发包通过Lock和Condition两个接口来实现管程,其中Lock用于解决互斥问题,Condition用于解决同步问题。
再造管程的理由
这三种方案可以全面弥补synchronized的问题。到这里相信你应该也能理解了,这三个方案就是“重复造轮子”的主要原因,体现在API上,就是Lock接口的三个方法。详情如下:
// 支持中断的API
void lockInterruptibly() throws InterruptedException;
// 支持超时的API
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 支持非阻塞获取锁的API
boolean tryLock();
如何保证可见性
它是利用了volatile相关的Happens-Before规则
什么是可重入锁
公平锁与非公平锁
用锁的最佳实践
永远只在更新对象的成员变量时加锁
永远只在访问可变的成员变量时加锁
永远不在调用其他对象的方法时加锁
15 | Lock和Condition(下):Dubbo如何用管程实现异步转同步?
那如何利用两个条件变量快速实现阻塞队列呢?
同步与异步
Dubbo源码分析
16 | Semaphore:如何快速实现一个限流器?
信号量模型
如何使用信号量
快速实现一个限流器
Semaphore可以允许多个线程访问一个临界区。
现实中还有这种需求?有的。比较常见的需求就是我们工作中遇到的各种池化资源,例如连接池、对象池、线程池等等。其中,你可能最熟悉数据库连接池,在同一时刻,一定是允许多个线程同时使用连接池的,当然,每个连接在被释放前,是不允许其他线程使用的。
17 | ReadWriteLock:如何快速实现一个完备的缓存?
那什么是读写锁呢?
快速实现一个缓存
实现缓存的按需加载
读写锁的升级与降级
18 | StampedLock:有没有比读写锁更快的锁?
StampedLock支持的三种锁模式
ReadWriteLock支持两种模式:一种是读锁,一种是写锁。而StampedLock支持三种模式,分别是:写锁、悲观读锁和乐观读。
进一步理解乐观读
StampedLock使用注意事项
19 | CountDownLatch和CyclicBarrier:如何让多线程步调一致?
利用并行优化对账系统
用CountDownLatch实现线程等待
进一步优化性能
用CyclicBarrier实现线程同步
20 | 并发容器:都有哪些“坑”需要我们填?
同步容器及其注意事项
List、Map、Set和Queue
并发容器及其注意事项
(一)List
(二)Map
(三)Set
(四)Queue
1.单端阻塞队列 2.双端阻塞队列 3.单端非阻塞队列 4.双端非阻塞队列
21 | 原子类:无锁工具类的典范
无锁方案的实现原理
原子类概览
- 原子化的基本数据类型
- 原子化的对象引用类型
- 原子化数组
- 原子化对象属性更新器
- 原子化的累加器
22 | Executor与线程池:如何创建正确的线程池?
线程池是一种生产者-消费者模式
如何使用Java中的线程池
使用线程池要注意些什么
23 | Future:如何用多线程实现最优的“烧水泡茶”程序?
如何获取任务执行结果
实现最优的“烧水泡茶”程序
24 | CompletableFuture:异步编程没那么难
CompletableFuture的核心优势
创建CompletableFuture对象
如何理解CompletionStage接口
CompletionStage接口如何描述串行关系、AND聚合关系、OR聚合关系以及异常处理。
- 描述串行关系
- 描述AND汇聚关系
- 描述OR汇聚关系
- 异常处理
25 | CompletionService:如何批量执行异步任务?
利用CompletionService实现询价系统
那到底该如何创建CompletionService呢?
CompletionService接口说明
利用CompletionService实现Dubbo中的Forking Cluster
26 | Fork/Join:单机版的MapReduce
对于简单的并行任务,你可以通过“线程池+Future”的方案来解决;如果任务之间有聚合关系,无论是AND聚合还是OR聚合,都可以通过CompletableFuture来解决;而批量的并行任务,则可以通过CompletionService来解决。
分治任务模型
Fork/Join的使用
ForkJoinPool工作原理
模拟MapReduce统计单词数量
27 | 并发工具类模块热点问题答疑
每篇文章的最后都给留了道思考题