大学时,我学习了一本国外的教科书,书名叫做《计算机网络------自顶向下方法》,这本书改变了我看待学习的角度。学习的顺序不是一成不变的,常规的路线通常从底层学习,这本书从应用层面入手,逐步讲解到底层,以一种对常规学习路线相反的方向学习,在我看来恰恰学习计算机网络最轻松上手的路径。很多时候我们追求一步到位,鞭辟入里的理解,反而忽略对于初学者,最佳的学习路线往往是兴趣与试错、感性和求索交织的,认识是逐渐深刻的。
知之者往往陷入知识的诅咒,知道的内容很难遗忘,甚至忘记了自己也是从不理解到懂的。有些书籍和文章对于初学者来说是不友好的,它们往往默认你掌握了很多前置知识。如果让我重头学习并发编程,我希望有类似自顶向下的学习路线。
以下是我总结的学习路线,感兴趣的朋友可以参考:
一、基础(并发与并行,性能与瓶颈,SIMD,MISD,进程、线程模型,虚拟线程,生命周期,上下文切换的开销有多大,跳过同步器、JMM等底层内容)
二、常用的并发模式
- 单线程(单线程实现简单且高效,很多多线程问题可以使用单线程解决)
- ThreadLocal/ScopedValue/TTL
- 消息队列(生产者消费者模式)
- 结构化并发(任务编排、资源安全管理、可观测性、快速失败思想)
- 函数式解决方案(纯函数、不可变对象、CopyOnWrite)
- 执行器与线程池(分离任务与执行的思想、资源管理与生命周期、多种执行器的特点(缓存执行器、固定线程执行器、线性执行器、直接执行器)、舱壁模式)
- 异步编程:CompletableFuture/ListenableFuture(函数式思想、回调地狱、任务编排/拆分、取消传播)
- 调度器(ScheduledExecutorService(常常被忽略却很有用),资源管理与调度算法)
- 延迟计算与记忆化,缓存与SingleFlight模式
- ForkJoin框架,并行流,分治思想
- EventLoop
三、并发集合类,使用与陷阱,阻塞队列
四、原子操作与原子类
五、锁(临界区、锁接口设计、锁的特点、可重入锁、读写锁、等待队列、条件队列,原生隐式同步锁,选择/构造线程安全的数据结构)
六、同步器和相关类(信号量、mutex、几种栅栏)
七、活性问题:死锁、饥饿、活锁,如何避免
八、性能优化、测试、监控、debug
九、底层实现原理(可见性、原子性、有序性)JMM,volatile实现(可见性窗口技巧),竞争条件,happens-before,DCL,VarHandler