专栏
下载APP
Java并发编程学习宝典(漫画版)
先源码后并发,双管齐下学Java
李一鸣 · Thoughtworks高级研发顾问

共计37节 · 已更新37节

2573人已订阅

课程亮点

  • 你的第一本图文并茂 Java 并发编程学习指南;
  • 生动有趣的讲师手绘插图辅助讲解,枯燥原理一看即懂;
  • 内容通俗有趣,讲解深入浅出,学习高效无障碍;

图片描述

  • 代码世界即现实世界,实际案例讲解便于理解掌握;
  • 深入底层源码解析,彻底理解 Java 并发的实现原理;
  • 代码示例结合实战,在实践中掌握 Java 并发的实现技巧。

与实战课程 Java 并发编程精讲的亮点区别:

  • 侧重于从原理解析角度进行讲解;
  • 侧重于 Java 并发最优设计模式与并发工具选择进行讲解;
  • 从原理到代码示例解析,循序渐进,层层深入。

课程简介图片描述

随着 CPU 的发展从提高频率转变为增加内核,如何利用好 CPU 的多核优势,变得日益重要,程序开发中采用多线程来提高效率也变得更为普遍。但多线程是把双刃剑,在提高计算效率的同时,也带来了开发的复杂度,因此需要我们对多线程开发有足够的认知,才能确保多线程程序正确运行。此外,多线程的知识也是面试中必考的知识点,要想拿下理想的职位,对多线程的深入学习是必不可少的。

不知你对多线程开发是否有过这样的困惑: 做了几年 Java web 开发,并没有写过多线程,但开发的软件一样高效、稳定运行,似乎多线程看起来并没有那么重要?其实不然。在你的代码背后,web 容器已经帮你实现了多线程,所有的请求都是单独的线程在并发处理。

多线程在软件领域的应用其实十分普遍,主要原因有如下几点:

  1. 避免 CPU 闲置
    假如在一个业务操作中包含对另外两个服务的调用,并且没有依赖关系。如果采用单线程,就需要等待第一个服务返回结果后再发出第二个请求,但其实在第一个请求发出后,CPU 就已经空闲了,大量时间花在了等待请求返回上。而如果采用多线程,同时发出两个请求,总的等待时间将会大大缩短。

  2. 程序解耦
    程序基本上都是由一个个方法的调用所组成。方法 A 返回结果传递给方法 B 继续处理。也可以是方法 A 和方法 B 产生的结果一块传递给方法 C 进一步处理。这其实这就是生产者和消费者。我们通过多线程,可以把逻辑以恰当的力度接耦,一个线程负责生产,另外一个线程负责消费。两个线程互不依赖,并且通过队列起到了缓冲的作用。这就像我们去饭店吃饭,前台负责收费接单,后厨按订单列表进行加工,这是典型的多线程。绝对不会有一个饭馆前台收完钱后,自己再去后厨炒菜。

  3. 提升性能
    一个人干活和一群人干活哪个更快?答案显而易见,程序也是如此。一般来说,线程越多性能也越好。不过在达到峰值后,再增加线程也不能继续提升性能。举个例子,你的经理让你做工作量评估。你说:我一个人要干十天。经理说:那两个人,5 天能干完吗?你想了想说:应该差不多。经理说:那我给你加 9 个人,1 天能搞定吗?显然这是不行的。

  4. 贴近现实世界
    我们生活的世界其实就是一个多线程的世界,可以认为每个人都是一个线程。而我们平时所做的绝大多数工作,都是多人完成的,也就是多线程完成。我们做软件设计时,都会参考现实世界中的类似设计。所以多线程是必不可少的设计要素之一。Java 是面向对象的语言,我们的代码都已经面向对象了,为什么我们编写的对象还要以单线程的方式运行呢?所以使用多线程就是这么自然而然的一件事情。更加贴近真实世界,意味着你的设计更加易于理解,并且不会有什么漏洞。

掌握了多线程开发,在必要时运用得当,将会让你的程序在以上几个层面有显著的提升。因此,作为一名开发人员,多线程开发是必备技能。此外,我们使用的开源软件,绝大多数都会用到多线程。学习多线程,对于我们理解开源软件代码将会带来很大的帮助。

多线程开发在 Java 中属于高阶的开发技术,如果能彻底掌握,并且灵活运用。无论是对未来升职或找到理想的工作,都有非常重要的作用。如今的技术面试,多线程知识几乎是必考的。因此,多线程这一关是要必过的。

讲师李一鸣,2006 年毕业于北京航空航天大学后,一直从事 Java 领域的软件开发,有着丰富的开发经验。曾经就职于联想集团,负责全球化系统的研发。后来在法律互联网行业创业,作为核心成员之一开发了多款法律互联网应用。目前作为高级研发顾问,就职于 Thoughtworks。在这里能够把更多的时间投入到技术本身,而这是技术人员的立命之本。业余时间参与了 Apache Pulsar 的中文文档翻译工作。为了增加大家的学习趣味,李一鸣老师亲手绘制了许多生动有趣的漫画插图,并采用现实中的案例进行类比讲解,帮助大家理解学习内容,专栏阅读更加轻松高效。

本专栏采用的结构如下:

  1. 概念植入:简明扼要说明本节要讲解的概念,首先让读者对要讲解的内容有所认知。并且明白学习本节的重要性;
  2. 概念分析:详细讲解本节涉及的概念,一般按以下逻辑进行讲解:
    2.1 问题:抛出问题;
    2.2 解决方案:由问题引出解决方案;
    2.3 分析:结合例子、图表进行分析,详细讲解解决方案;
    2.4 代码:通过实践来解决问题。
  3. 总结:提炼本节讲解的核心知识点与概括总结,并对下一节内容做铺垫。
查看全部
专栏目录
目录
适合人群

1、初入职场,有简单的 Java 开发基础,想要从基础开始学习 Java 多线程开发。

2、有 3-5 年甚至更多开发经验,想要深入了解 Java 多线程开发。

3、学习过多线程,想要了解在实际项目中如何应用。

4、准备跳槽面试,想要全方位,较为深入的学习多线程。

购买须知
  1. 本专栏为图文形式内容服务,共计 35 小节,上线时间为 2019 年 9 月 10 日,预计 2019 年 12 月 20 日更新完成;
  2. 本专栏更新时间为每周 2、4 更新 1 篇(法定节假日顺延),形式为图文;
  3. 订阅成功后,用户即可通过慕课网 PC 端、App 端、WAP 端享有永久阅读的权限;
  4. 慕课专栏为虚拟内容服务,订阅成功后概不退款;
  5. 在专栏阅读过程中,如有任何问题,请邮件联系 kf@imooc.com;
  6. 慕课专栏版权归本平台所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布 / 发表,违者将依法追究责任。
0 / 3
登录后可任选 3 个小节免费阅读
Edingbrugh

笔者很有见解。写的不错之前没有认真的读读,读了好几次了受益颇多。期待下一个专栏。加油

3天前
0
业精于勤荒于嬉行成于思毁于随2019

写的不错呀,果然是大佬

2020-01-07
0
向远之航

我反而觉得这样的安排挺好的,在深入线程池之前,自己的思路没有被侵染,自己动手来实现一个线程池更能体会其中的精妙之处。当然,这个虽简单但却设计精奥的线程池,着实花了不少时间来理解每一个类的功能,感觉类之间层层相关,需要反复揣摩。

2019-11-27
3
qq_oreo_5

老师 快更那 辛苦了 跟您学到很多 谢谢

2019-11-03
2
happyjey

嗯,有追剧的快感?,相当精彩!!!

讲师回复:感谢同学一直以来的支持!
2019-09-26
2
weixin_慕婉清1547377

很不错,看了,加深记忆

2019-09-18
0
海天s

写的很好,解释得很清楚,谢谢

讲师回复:谢谢同学一直一来的支持^^
2019-11-05
1
程序员经纪人

真心感谢能出漫画版,这样使得新手也能快速入门,感谢

讲师回复:多谢同学支持。说实话画插图会花费很多时间,不过如果能对学习有所帮助,提升学习兴趣,辛苦也是值得的。
2019-09-13
0
挨踢狗2020

一直对多线程望而却步 这次一定要好好学下来 要不总觉得少了点什么 看完一章还想看 成功的激起了我的好奇心 感谢大大 辛苦编写 看完我一定会有所收获

讲师回复:一直跟下来,相信一定会有所收获,贵在坚持。
2019-09-12
3
慕沐7111824

老师快点更新啊,我的大刀早已饥渴难耐了!

2019-09-16
0
轻风吹拂

老师讲的多线程一针见血,全力支持!!!!

讲师回复:多谢同学支持,后面会越来越精彩,一定要坚持学下去。
2019-09-11
1
挨踢狗2020

快快更新 即可难耐

2019-09-14
4
李一鸣

每周二、周四会准时更新,同学们保持好学习的节奏。每篇文章的学习完成后,可以自己写代码实践,也可以自己读一读没有讲到的源代码。或者写写学习笔记,学习就是不断输入再输出的过程。

2019-09-16
3
过往云烟很帅

老师快更新,写的很不错,interrupt 我感觉使用场景很小 还有哪些使用场景呢 yield我感觉根本就没使用场景

讲师回复:线程需要被强行唤醒时调用interrupt。打个比方,你的同桌前一晚去网吧刷夜,第二天上课困了,于是趴桌子上睡着了。没过多久,老师点名你同桌回答问题,那你只好把你同桌叫醒。在多线程开发时,可能有个线程A没有工作的时候会选择sleep一段时间,但是另外有一个线程B一旦发现有工作,需要A立即开始干活,那么B就需要对A执行interrupt。yield在实际开发中几乎用不到。
2019-09-19
3
weixin_德地_0

老师,加油更新啊

2019-11-01
0
TobiasTao

我已经学习了悟空老师的并发实战课,他讲得很好很详细,但是我看这个专栏的内容和实战课内容很多都是一样的,那我还需要学这个专栏吗?这个专栏和实战课有什么区别?

讲师回复:同学你好。本专栏和并发实战课确实有部分讲解的内容是相同的。但其实还是有很多不同的内容,例如本专栏会有多种并发工具的分析,后面还会有常用的并发设计模式等内容。实战课和本专栏可以一起学习,相互补充,可能会有更好的效果。
2019-09-10
5
窗下有梧桐

今年刚刚大学毕业参加工作,空余时间在补充自己的知识库。并发编程这方面其实以前也在看,不过网上能找到的免费视频大多数讲的很笼统,复杂的就一笔带过了。希望在学习完这个专栏后能让我掌握到并发编程的艺术。46块钱如果能换这么多知识也是相当划算了,哈哈

讲师回复:46块钱买不来吃亏,买不来上当。不过不管钱多少,贵在坚持。只要坚持下来,肯定收获满满。
2019-09-11
1
过往云烟很帅

老师快更新,太少了 一会就看完了 我预测下一章就是讲 synchronized

讲师回复:每周会按时更新两篇,保持好节奏,方能持久。synchronized肯定会讲,不过不是下篇^^
2019-09-11
1
烟光云影

希望课程,去你说的一样精彩。不是只停留在表面

讲师回复:请放心,专栏的难度和深度会逐渐增加。我会竭尽所能把精彩的文章呈现给同学们。感谢支持!
2019-09-11
2
zhangchaoyang

老师,这里我有点疑惑,那实现多线程到底有几种方式?那用Timer新建线程的方式算不算呢?

讲师回复:是的同学,线程的实现方式本质上只有两种,继承Thread类和实现Runnable接口。FutureTask 和 Executor也是通过 Thread 和 runnable 。我这里没有把Timer列入多线程的实现方式,是因为Timer的主要用途为定时触发任务,而同步还是异步执行任务只是Timer的实现方式。从包结构可以看出,Timer并不在java.util.concurrent包中。^^
2019-09-10
1
— 造烛求明,读书求理 —
¥58.00
立即购买