Java并发编程实战第二部分学习记录

在这里插入图片描述

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 | 原子类:无锁工具类的典范

无锁方案的实现原理

原子类概览

在这里插入图片描述

  1. 原子化的基本数据类型
  2. 原子化的对象引用类型
  3. 原子化数组
  4. 原子化对象属性更新器
  5. 原子化的累加器

22 | Executor与线程池:如何创建正确的线程池?

线程池是一种生产者-消费者模式

如何使用Java中的线程池

使用线程池要注意些什么

23 | Future:如何用多线程实现最优的“烧水泡茶”程序?

如何获取任务执行结果

实现最优的“烧水泡茶”程序

24 | CompletableFuture:异步编程没那么难

CompletableFuture的核心优势

创建CompletableFuture对象

如何理解CompletionStage接口

CompletionStage接口如何描述串行关系、AND聚合关系、OR聚合关系以及异常处理。

  1. 描述串行关系
  2. 描述AND汇聚关系
  3. 描述OR汇聚关系
  4. 异常处理

25 | CompletionService:如何批量执行异步任务?

利用CompletionService实现询价系统

那到底该如何创建CompletionService呢?

CompletionService接口说明

利用CompletionService实现Dubbo中的Forking Cluster

26 | Fork/Join:单机版的MapReduce

对于简单的并行任务,你可以通过“线程池+Future”的方案来解决;如果任务之间有聚合关系,无论是AND聚合还是OR聚合,都可以通过CompletableFuture来解决;而批量的并行任务,则可以通过CompletionService来解决。

分治任务模型

Fork/Join的使用

ForkJoinPool工作原理

模拟MapReduce统计单词数量

27 | 并发工具类模块热点问题答疑

每篇文章的最后都给留了道思考题

1. while(true) 总不让人省心

2. signalAll() 总让人省心

3. Semaphore需要锁中锁

4. 锁的申请和释放要成对出现

5. 回调总要关心执行线程是谁

6. 共享线程池:有福同享就要有难同当

7. 线上问题定位的利器:线程栈dump

发布了138 篇原创文章 · 获赞 3 · 访问量 7211

猜你喜欢

转载自blog.csdn.net/weixin_43719015/article/details/105668197