- 课程目录
- 课程介绍
-
在线阅读:开篇词 | 你为什么需要学习并发编程?
看透并发的本质逻辑,坚持做有长期价值的事儿,让你的一分辛劳成就三分收获。
-
学习攻略 | 如何才能学好并发编程?
学习并发编程时,如何才能一分辛劳三分收获呢?你需要有两个方面的突破。
-
01 | 可见性、原子性和有序性问题:并发编程Bug的源头
深刻理解可见性、原子性、有序性在并发场景下的原理后,很多并发Bug都是可以理解和诊断的。
-
02 | Java内存模型:看Java如何解决可见性和有序性问题
Java的内存模型是并发编程领域的一次重要创新,也是职场面试中的热门考点。它可以解决可见性和有序性导致的问题。
-
03 | 互斥锁(上):解决原子性问题
对于并发编程中的原子性问题,必须深入分析锁定对象和受保护资源的关系,综合考虑受保护资源的访问路径,多方面考量用好互斥锁。
-
04 | 互斥锁(下):如何用一把锁保护多个资源?
如何保护多个资源?类比门票管理,其实核心就是要选对锁,梳理出共享资源,找出访问路径,然后再将所有的访问路径设置合适的锁。
-
05 | 一不小心就死锁了,怎么办?
在优化性能的过程中,要特别注意可能导致的死锁问题。
-
06 | 用“等待-通知”机制优化循环等待
等待-通知机制是一种非常普遍的线程间协作方式。
-
07 | 安全性、活跃性以及性能问题
并发编程是一个复杂的技术领域,微观上涉及到原子性问题、可见性问题和有序性问题,宏观则表现为安全性、活跃性以及性能问题。
-
08 | 管程:并发编程的万能钥匙
并发编程里两大核心问题——互斥和同步,都可以由管程来解决。学好管程,就相当于掌握了一把并发编程的万能钥匙。
-
09 | Java线程(上):Java线程的生命周期
理解Java线程的各种状态以及生命周期对于诊断多线程Bug非常有帮助。
-
10 | Java线程(中):创建多少线程才是合适的?
创建多少线程合适,这不是一个简单的问题,要看多线程具体的应用场景。
-
11 | Java线程(下):为什么局部变量是线程安全的?
很多人都知道局部变量是不存在数据竞争的,但是至于原因嘛,就说不清楚了。
-
12 | 如何用面向对象思想写好并发程序?
在Java语言里,面向对象思想能够让并发编程变得更简单。
-
13 | 理论基础模块热点问题答疑
学好理论有思路,关注细节定成败。
-
14 | Lock和Condition(上):隐藏在并发包中的管程
Java SDK并发包通过Lock和Condition两个接口来实现管程,分别解决互斥和同步问题。
-
15 | Lock和Condition(下):Dubbo如何用管程实现异步转同步?
Lock&Condition实现的管程相对于synchronized实现的管程来说更加灵活、功能也更丰富。
-
16 | Semaphore:如何快速实现一个限流器?
使用信号量可以轻松实现一个限流器,并且帮助阻塞和唤醒操作,使用起来还是非常简单的。
-
17 | ReadWriteLock:如何快速实现一个完备的缓存?
针对读多写少这种并发场景,Java SDK并发包提供了读写锁——ReadWriteLock,非常容易使用,并且性能很好。
-
18 | StampedLock:有没有比读写锁更快的锁?
StampedLock的性能比读写锁还要好。本文介绍了它的使用方法、内部工作原理以及在使用时的注意事项。
-
19 | CountDownLatch和CyclicBarrier:如何让多线程步调一致?
CountDownLatch和CyclicBarrier是Java并发包提供的两个非常易用的线程同步工具类。
-
20 | 并发容器:都有哪些“坑”需要我们填?
Java 1.5之前提供的同步容器虽能保证线程安全,但性能很差;之后提供的并发容器则做了很多优化,并且类型也更加丰富了。
-
21 | 原子类:无锁工具类的典范
Java SDK并发包将无锁方案封装提炼之后,实现了一系列的原子类,内容丰富。无锁方案相对互斥锁方案,最大的好处就是性能。
-
22 | Executor与线程池:如何创建正确的线程池?
线程池在Java并发编程领域非常重要,很多大厂的编码规范都要求必须通过线程池来管理线程。
-
23 | Future:如何用多线程实现最优的“烧水泡茶”程序?
利用多线程可以快速将一些串行的任务并行化,从而提高性能;如果任务之间有依赖关系,也基本上都可以用Future来解决。
-
24 | CompletableFuture:异步编程没那么难
Java在1.8版本提供了CompletableFuture来支持异步编程,虽复杂但功能也着实让人震撼。
-
25 | CompletionService:如何批量执行异步任务?
CompletionService将线程池和阻塞队列的功能融合在了一起,能够让批量异步任务的管理更简单。
-
26 | Fork/Join:单机版的MapReduce
Fork/Join并行计算框架主要解决的是分治任务,核心组件是ForkJoinPool,它支持任务窃取机制,性能很好。
-
27 | 并发工具类模块热点问题答疑
这模块13篇文章的13个思考题,基本上都是相关工具类在使用中需要特别注意的一些细节问题。
-
28 | Immutability模式:如何利用不变性解决并发问题?
Immutability模式是最简单的解决并发问题的方法,可以作为你解决并发问题的一个首选。
-
29 | Copy-on-Write模式:不是延时策略的COW
Copy-on-Write在很多领域都有着广泛的应用,潜力巨大。
-
30 | 线程本地存储模式:没有共享,就没有伤害
线程本地存储模式本质上是一种避免共享的方案。没有共享,自然也就没有并发问题。
-
31 | Guarded Suspension模式:等待唤醒机制的规范实现
Guarded Suspension模式本质上是一种等待唤醒机制的实现,只不过规范化了。
-
32 | Balking模式:再谈线程安全的单例模式
Balking模式本质上是一种规范化地解决“多线程版本的if”的方案,经典实现是使用互斥锁。
-
33 | Thread-Per-Message模式:最简单实用的分工方法
并发编程领域里,解决分工问题也有一系列的设计模式,其中就有我们今天要重点介绍的Thread-Per-Message模式。
-
34 | Worker Thread模式:如何避免重复创建线程?
Worker Thread模式能避免线程频繁创建、销毁的问题,而且能够限制线程的最大数量。
-
35 | 两阶段终止模式:如何优雅地终止线程?
两阶段终止模式是一种应用很广泛的并发设计模式,在Java语言中用于优雅地终止线程。
-
36 | 生产者-消费者模式:用流水线思想提高效率
除了在线程池中的应用,为了提升性能,并发编程领域很多地方也都用到了生产者-消费者模式。
-
37 | 设计模式模块热点问题答疑
本文对前面的9种设计模式做个分类和总结,同时也对前面各章的课后思考题做个答疑。
-
38 | 案例分析(一):高性能限流器Guava RateLimiter
本文介绍了Guava是如何实现令牌桶算法的,Guava RateLimiter扩展了该算法,解决了高并发下的限流问题。
-
39 | 案例分析(二):高性能网络应用框架Netty
Netty是一个款优秀的网络编程框架,性能非常好。它的线程模型设计得很精巧,从而避免了并发程序的各种问题。
-
40 | 案例分析(三):高性能队列Disruptor
Disruptor是一款高性能的有界内存队列,目前应用非常广泛。
-
41 | 案例分析(四):高性能数据库连接池HiKariCP
HiKariCP号称业界跑得最快的数据库连接池。FastList和ConcurrentBag这两个数据结构使用得很巧妙。
-
42 | Actor模型:面向对象原生的并发模型
Actor模型是一种非常简单的计算模型,基本的计算单元称为Actor。
-
43 | 软件事务内存:借鉴数据库的并发经验
很多编程语言都有从数据库的事务管理中获得灵感,并且总结出了一个新的并发解决方案:软件事务内存,简称STM。
-
44 | 协程:更轻量级的线程
无论是从时间维度还是空间维度来看,协程都比线程轻量得多。相信不久的将来,Java程序员也可以使用协程来解决并发问题了。
-
45 | CSP模型:Golang的主力队员
Golang中虽然也支持传统的共享内存的协程间通信方式,但是推荐的还是使用CSP模型,以通信的方式共享内存。
-
结束语 | 十年之后,初心依旧
最后咱们轻松一下吧,聊聊人生、聊聊理想,正好我也和你聊聊我那些“不堪回首的往事”。
-
结课测试 | 这些Java并发编程实战的知识你都掌握了吗?
《Java并发编程实战》课程结束了!来做一下测试题吧!
-
用户来信 | 真好,面试考到这些并发编程,我都答对了!
真的很庆幸提前遇到了并发专栏,我的面试顺利通过了。
-
3 个用户来信 | 打开一个新的并发世界
很高兴能再次收到用户的来信,一下子还是 3 封,真是受宠若惊。
课程介绍
618 狂欢 | 课程专属口令 你将获得 全面了解并发编程核心原理; 深入掌握12个Java并发工具类; 搞懂9种最常见的并发设计模式; 4大经典并发编程实战案例。 讲师介绍...618 狂欢 | 课程专属口令
你将获得
- 全面了解并发编程核心原理;
- 深入掌握12个Java并发工具类;
- 搞懂9种最常见的并发设计模式;
- 4大经典并发编程实战案例。
讲师介绍
毕业至今,王宝令已前前后后写了15年的程序,曾任职于用友、金蝶、惠普等公司。最近6年他一直从事Java开发平台和基础中间件的设计开发工作。
课程介绍
对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。
那到底应该怎么学习并发编程呢?Java SDK的并发工具包有很多,是要死记硬背每一个工具的优缺点和使用场景吗?当然不是,想要学好并发编程,你需要从一个个单一的知识和技术中“跳出来”,高屋建瓴地看问题,并逐步建立自己的知识体系。
本专栏希望能够帮助你建立起一张处理并发问题的全景图,让你能够彻底理解并发问题的本质所在。同时,专栏还会深入介绍Java并发编程技术背后的逻辑关系以及应用场景,助你能够游刃有余地游走在这些技术之中。
专栏共45期,分为5大模块。
1. 并发理论基础
这个模块主要介绍并发编程相关的概念和理论。但不会死板地堆叠结论,而是关注具体概念和理论的产生背景,挖掘它们背后的逻辑关系,发现核心矛盾并寻找解决方案。比如,深度认识Java内存模型、死锁产生的原因和解决方案、线程间的协作机制,等等。
2. 并发工具类
这个模块主要探讨Java SDK里的并发工具类。这些工具类大部分都是基于管程实现的,所以这里会首先介绍隐藏在并发包中的管程及其使用。紧接着还会为你详细解读信号量、读写锁、CountDownLatch和CyclicBarrier,以及并发编程的三个核心问题“分工”“同步”“互斥”相关的技术内容。
3. 并发设计模式
并发设计模式是解决并发问题的最佳实践。这个模块将会介绍9种常见的设计模式。其中,前3种设计模式的核心思想是避免共享变量,从而避免并发问题;后面6种设计模式则都属于典型的分工模式。
4. 案例分析
这个模块着重分析4个经典的开源框架是如何处理并发问题的,包括高性能限流器Guava RateLimiter、高性能网络应用框架Netty、高性能队列Disruptor、高性能数据库连接池HiKariCP,希望能够帮你融会贯通相关知识点,并从实战场景中思考问题的最优解。
5. 其他并发模型
并发问题是一个通用问题,Java语言解决并发问题采用的是共享内存模型,但这个模型并不是解决并发问题唯一的模型。这个模块将会介绍共享内存模型之外的模型,主要有Actor模型、软件事务内存、协程和CSP模型。
课程目录


