并发编程学习策略

并发编程学习策略

01 | 学好并发两步曲

1)跳出来,看全景
2)钻进去,看本质

02 | 跳出来,看全景

1、导读

1)从单一的知识和技术中“跳出来”,从全局看并发编程。
2)建立一张全景图,将并发编程抽象成三个核心问题:分工、同步、互斥。

2、分工

1)定义:所谓分工,类似于现实中一个组织完成一个项目,项目经理要拆分任务,安排合适的成员去完成。
2)并发领域里,分工很重要,它直接决定了并发程序的性能。
3)学习分工:最佳的方式就是和现实世界做对比。
例如生产者和消费者,可以分别类比大厨和服务员。

3、同步

1)定义:在并发编程领域里的同步,主要指线程间的协作,指一个线程执行完任务,如何通知执行后续任务的线程开工。
2)协作一般是和分工相关的,但很多场景需要自己来处理线程之间的协作。
例如:Executor、Fork/Join、Future 本质上都是分工方法,但同时也能解决线程协作的问题。
3)工作中的线程协作问题:当某个条件不满足时,线程需要等待,当某个条件满足时,线程需要被唤醒执行。
4) 在 Java 并发编程领域,解决协作问题的核心技术是管程,管程是一种解决并发问题的通用模型,可以解决线程协作和互斥问题。
5)管程是解决并发问题的万能钥匙。
6)学习同步:关键是理解管程模型,学好它可以解决所有问题。此外,了解并发包提供线程协作的工具类应用场景,可以提高工作效率。

4、互斥

1)定义:互斥指的是同一时刻,只允许一个线程访问共享变量。
2)区别:分工、同步主要强调的是性能,互斥强调的是正确性(线程安全)。
3)导致不确定性的源头:可见性问题、有序性问题和原子性问题。
4) Java语言引入内存模型,可以避免可见性、有序性问题,但不能完全解决线程安全问题。
5)解决线程安全问题的核心方案还是互斥,实现互斥的核心技术就是锁,锁解决了安全性问题,但同时也带来了性能问题。
6)保证安全同时改善性能问题可以考虑:分场景优化(例如 ReadWriteLock、StampedLock)、使用无锁的数据结构(例如原子类)、以及原理是不共享变量或者变量只读的其他方案(例如Thread Local 和 final 关键字、Copy-on-write 模式)
7)锁除了要注意性能问题外,还需要注意死锁问题。其中,可见性:cpu和缓存;原子性:操作系统;无锁算法:cpu缓存。

5、全景图的思维导图
并发编程学习策略

03 | 钻进去,看本质

1、导读

1)光跳出来看全景还不够,还需要在某个问题上钻进去,深入理解,找到本质。

2、见解

1)工程上的解决方案,一定要有理论做基础。
2)通过探索,发现 Java 语言里的并发技术基本都是有理论基础的,技术的本质是背后的理论模型。

04 | 小结

1)学习并发要让自己的知识成体系,要挖掘Java SDK 并发包背后的设计理念。
2)通过对并发问题总结,勾勒出分工、同步、互斥的全景图,可以让自己快速建立解决并发问题的思路,梳理并发编程的知识,加深认识。
3)学习某个具体的技术,需要探索它背后的理论本质,理论的应用面更宽,一项优秀的理论往往在多个语言中都有体现,在多个不同领域都有应用。

05 | 思维导图

1、并发编程学习策略思维导图
并发编程学习策略
参考文献:

[1]王宝令. Java并发编程实战[M]. 极客时间, 2019.