写点什么

实战案例,个个是经典,不愧是阿里 P7 私传“并发编程核心讲义”,竟能讲的如此通透

作者:程序知音
  • 2022 年 9 月 28 日
    湖南
  • 本文字数:2138 字

    阅读完需:约 7 分钟

最近几年,并发编程已经慢慢成为了一项必备技能。高薪岗位面试必问,并发编程似乎已经成为大厂必备的敲门砖。

这主要是硬件的驱动以及国内互联网行业的飞速发展决定的,现在 64 核的服务器已经飞入寻常百姓家,大型互联网厂商的系统并发量轻松过百万,传统的中间件和数据库已经不能为我们遮风挡雨,反而成了瓶颈所在。

于是,并发编程成为近年非常热门的领域,人才稀缺。但与此同时,关于并发编程的书籍也渐渐丰富起来了,庞杂而且生涩难懂。经过这些年接触,我发现很多小伙伴,都是工作几年后很多技术突飞猛进,只有并发编程成为瓶颈,虽然并发相关的类库他们也熟悉,却总是写不出正确、高效的并发程序,原因在哪里?我发现很多人是因为某个地方有了盲点,忽略了一些细节,但恰恰是这些细节决定了程序的正确性和效率。

所以我极力向大家推荐这份由三位阿里 P8 大牛精心整理的笔记《并发编程核心讲义》,耗时三个月,十余年实战经验积累对并发编程的相关知识做了系统全面的讲解。因此,可以帮助并发编程初学者快速入门和提高并掌握其原理,同时还融入了大量并发调优经验,并且深入浅出的剖析底层实现,让开发者不仅知其然,也知其所以然

文档笔记涵盖:37 个知识点全析,4 个经典实战案例剖析,归纳总结。

笔记线路:并发理论基础(13)→并发工具类(14)→并发设计模式(10)→实战案例剖析(4)

ps:需要原文档参考学习的小伙伴--->  我的笔记 <--- 】

下面就让我们来看这份《并发编程核心讲义》笔记的庐山真面目吧!可在文末了解详情。





一、并发理论基础

内容涵盖:并发编程 Bug 的源头+Java 内存模型+互斥锁+死锁+用“等待-通知”机制优化循环等待+安全性、活跃性以及性能问题+并发编程的万能钥匙+Java 线程+如何写好并发程序)

1、并发编程 Bug 的源头

  • 缓存导致的可见性问题

  • 线程切换带来的原子性问题

  • 编译优化带来的有序性问题



2、Java 内存模型

  • 什么是 Java 内存模型?

  • 使用 volatile 的困惑

  • Happens-Before 规则

  • 被我们忽视的 final



3、互斥锁

  • 简易锁模型

  • 改进后的锁模型

  • synchronized

  • 用 synchronized 解决 count+=1 问题

  • 锁和受保护资源的关系

  • 保护没有关联关系的多个资源

  • 保护有关联关系的多个资源

  • 使用锁的正确姿势



4、死锁

  • 怎么解决?

  • 细粒度锁

  • 如何预防死锁



5、用“等待-通知”机制优化循环等待

  • 完美的就医流程

  • 用 synchronized 实现等待 - 通知机制

  • 小试牛刀:一个更好地资源分配器

  • 尽量使用 notifyAll()

  • 总结



6、安全性、活跃性以及性能问题

  • 安全性问题

  • 活跃性问题

  • 性能问题

  • 总结

并发编程是一个复杂的技术领域,微观上涉及到原子性问题、可见性问题和有序性问题,宏观则表现为安全性、活跃性以及性能问题。

我们在设计并发程序的时候,主要是从宏观出发,也就是要重点关注它的安全性、活跃性以及性能。安全性方面要注意数据竞争和竞态条件,活跃性方面需要注意死锁、活锁、饥饿等问题,性能方面......。



6、管程:并发编程的万能钥匙

  • 什么是管程

  • MESA 模型

  • wait() 的正确姿势

  • notify() 何时可以使用

  • 总结



7、Java 线程的生命周期

  • 通用的线程生命周期

  • Java 中线程的生命周期

  • RUNNABLE 与 BLOCKED 的状态转换

  • RUNNABLE 与 WAITING 的状态转换

  • RUNNABLE 与 TIMED_WAITING 的状态转换

  • 从 NEW 到 RUNNABLE 状态

  • 从 RUNNABLE 到 TERMINATED 状态

  • 总结



8、创建多少线程才是合适的?

  • 为什么要使用多线程?

  • 多线程的应用场景

  • 创建多少线程合适?

  • 总结



9、为什么局部变量是线程安全的?

  • 方法是如何被执行的

  • 局部变量存哪里?

  • 调用栈与线程

  • 线程封闭

  • 总结



10、如何用面向对象思想写好并发程序?

  • 封装共享变量

  • 识别共享变量间的约束条件

  • 制定并发访问策略

  • 总结



二、并发工具类

内容涵盖:Lock 和 Condition+Semaphore+ReadWriteLock+StampedLock+CountDownLatch 和 CyclicBarrier+并发容器之坑+原子类+Executor 与线程池+Future+CompletableFuture+CompletionService+Fork/Join)

1、Lock 和 Condition

  • 再造管程的理由

  • 如何保证可见性

  • 什么是可重入锁

  • 公平锁与非公平锁

  • 用锁的最佳实践

  • 同步与异步

  • Dubbo 源码分析



2、Semaphore:如何快速实现一个限流器?

  • 信号量模型

  • 如何使用信号量

  • 快速实现一个限流器

  • 总结



3、ReadWriteLock:如何快速实现一个完备的缓存?

  • 快速实现一个缓存

  • 实现缓存的按需加载

  • 读写锁的升级与降级

  • 总结



4、StampedLock:有没有比读写锁更快的锁?

  • StampedLock 支持的三种锁模式

  • 进一步理解乐观读

  • StampedLock 使用注意事项

  • 总结



5、CountDownLatch 和 CyclicBarrier:如何让多线程步调一致?

  • 利用并行优化对账系统

  • 用 CountDownLatch 实现线程等待

  • 进一步优化性能

  • 用 CyclicBarrier 实现线程同步

  • 总结

6、并发容器:都有哪些“坑”需要我们填?

  • 同步容器及其注意事项

  • 并发容器及其注意事项

  • List

  • Map

  • Set

  • Queue

7、原子类:无锁工具类的典范

  • 无锁方案的实现原理

  • 看 Java 如何实现原子化的 count += 1

  • 原子类概览



8、Executor 与线程池:如何创建正确的线程池?

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

  • 如何使用 Java 中的线程池

  • 使用线程池要注意些什么

  • 总结

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

10、CompletableFuture:异步编程没那么难

11、CompletionService:如何批量执行异步任务?

12、Fork/Join:单机版的 MapReduce

未完待续.......。

获取方式:需要这份 《并发编程核心讲义》笔记 仅需添加小助理 vx:XIaonan00000621 即可获取免费下载方式!


需要原文档参考学习的小伙伴--->  我的笔记 <--- 】

用户头像

程序知音

关注

还未添加个人签名 2022.06.25 加入

还未添加个人简介

评论

发布
暂无评论
实战案例,个个是经典,不愧是阿里P7私传“并发编程核心讲义”,竟能讲的如此通透_Java_程序知音_InfoQ写作社区