如何学习Java多线程

最近一段时间,我对《Java并发编程实践》这本经典而又有些难懂的书籍,尝试用了一些简单有趣、通俗易懂的方式进行解读,现整理成GitBook(文末有链接),方便大家阅读。

为什么要解读这本书

因为这是一本经典却又难懂的书。

这本书的经典我想不必多讲了,几乎所有想学习Java并发的同学,都会被推荐去看这本书(虽然他们中的大多数在看了不到三分之一之后就放弃了),作为一本书籍,最重要的是系统性和准确性,这本书涵盖了Java并发中几乎所有基础知识点,并且大多数章节都配有实际案例,是一本非常值得收藏的Java并发参考手册。

那么为什么说这本书难懂呢?
总的来说有以下几点:

  • 理论过多。举个例子,书中第五章,在讲Java并发的一些基础构建模块时(ConcurrentHashMap、CopyOnWriteArrayList、Future这些),前面用了很多篇幅讲这些类的理论知识,到章节最后才用一个实际案例将这些知识串起来,而很多读者在看前面那些枯燥乏味的理论性讲解时,就已经消耗了太多意志力,导致最后根本没精力看最后的案例;
  • 有点跳跃。书中对一些知识点的讲解,并没有完全讲透,有些只是一笔带过,读者看到难免就会心里好多个疑问,然后就试图通过上下文去理解作者的意思,最后又消耗了大量意志力,导致最终的弃读;
  • 中文翻译别扭。这是很多经典技术书籍的通病了,本身这本书就很难懂,翻译的别扭,就更难懂了。

针对上面这些问题,我采用了以下方式进行解读:

  • 用讲故事的方式进行讲解。让文章兼具知识性和娱乐性,让读者阅读时不会感到枯燥;
  • 先案例后理论。我把书中放在章节最后的案例,挪到了文章的开头,让读者先对知识有了大概的了解,同时引发读者的好奇心,在看文章后面的偏理论解读的时候,不会昏昏欲睡;
  • 不局限于书籍本身。和大多数读者一样,我在看这本书的时候,也经常会卡壳,然后翻寻上下文,依旧百思不得其解。这时候就需要用到搜索引擎了,所以你经常会在我的文章末尾看到除了《Java并发编程实践》以外的其他参考文献;
  • 必要时看原著。上面说了,有些段落的中文翻译实在看着别扭,这时候就需要看回原著,看看作者自己是如何表述的。

解读脉络

我这次解读的内容,也许只包含了Java并发中20%的知识,但这20%的知识,已经足以涵盖平时80%的使用场景。下面简单梳理一下这份解读的脉络。

1、为什么要使用线程池
首先,你学习Java多线程,得知道为什么要使用多线程吧?干嘛不老老实实使用单线程呢?这部分比较简单,书里讲的也很清楚,网上一搜资料也一大把,所以这部分不作解读 ( ̄ ̄)~

2、如何写出线程不安全的代码
好,现在你知道为什么要学Java多线程了。
那么当我们谈学习多线程时,我们是在谈学习什么呢?谈如何创建线程吗?不是,多线程里的大多数知识,都是在讲如何在多线程的环境下,保证代码的线程安全性,所以,接下来,你要了解,如何写出线程不安全的代码,知道什么样的代码是线程不安全的,你才会去想如何才能让它线程安全。

3、两个最基础的关键字
现在你写出了线程不安全的代码,是时候想想要怎样把它们变成线程安全的了。
在Java中,实现线程安全,最最基础的就是两个关键字,volatilesynchronize
volatile用的比较少,但是通过对它的学习,你可以了解Java内存模型,学会透过JVM去看线程问题,这是一个思考范式的提升Volatile趣谈——我是怎么把贝克汉姆的进球弄丢的
synchronize,无需多言,不管是我们自己写的代码,还是JDK里的各个线程安全类,如ConcurrentHashMap,HashTable,大多都是利用synchronize来实现的线程安全:如何用一句话介绍synchronize的内涵

4、学会委托
学会了volatile和synchronize,以后就可以靠着两兄弟打遍天下无敌手了?
理论上可行,不过就像那句话说的,拿着锤子的人,看谁都是钉子。要想建一栋大楼,我们不能只有锤子,我们还需要起重机。Java就给了我们很多牛哄哄的起重机,比如ConcurrentHashMap,想想看,每次你想让你的Map线程安全,都要自己手动加上synchronize,这多麻烦,有了ConcurrentHashMap,我们只要把线程安全的重任,委托给它去实现就ok了。
Java中可以被委托的类还有很多,大体上分为三类,同步容器、并发容器和同步工具类,我的解读,也是通过一个简单的缓存案例,展示了如何把一个原本线程不安全的代码,通过synchronize改为线程安全,再通过委托,强化为性能更猛的缓存器:Java趣谈——如何构建一个高效且可伸缩的缓存

5、学点内功——线程池
现在你已经掌握了极强的外功了,十八般武艺样样精通,可以去武林大会挑战武林盟主了吗?还不行,光有极强的外功,却没有与之匹配的内功,只会让你走火入魔。
Java多线程也是如此,上面讲的都是外功,教你如何使用各种工具实现线程安全,但是想想看,实际项目中,你真的可以每个任务过来都给它创建一条线程吗?肯定不行嘛,内存会撑爆的!所以,你还需要掌握一项管控线程数量的技术——线程池,我将通过一个Web服务器的案例,给你展示为什么要使用线程池以及如何将无线程数量管控的代码改为由线程池管控的代码:Java趣谈——如何像Tomcat一样处理请求
另外,我还将从Java并发大师Doug Lea的视角,带你了解Java线程池背后的原理:Java线程池是如何诞生的?

6、学点设计——并发方案
学会了外功,又掌握了内功,可以上江湖闯荡了吗?等等,还有一点,你要知道什么才是你应该出手的时机,你总不能一上来就放大招杀敌一千自损四百吧。Java并发也是如此,你要知道,在什么情况下,应该对任务进行并行化处理,以及哪种情况下并行处理效果更好,我用了一个页面渲染器的案例,给你展示了,如何对并发方案进行设计和优化:Java趣谈——如何写出一个高效的页面渲染器

以上就是我对《Java并发编程实践》中,足以解决你80%的并发问题的20%知识的解读,其他没有解读的包括:

  • 如何取消和关闭线程
  • 如何避免线程的活跃性风险
  • 如何提升性能和可伸缩性
  • 如何测试并发程序
  • 显示锁及其原理
  • 如何自定义同步工具
  • 原子变量及其原理
  • 非阻塞算法及其原理

难道这些知识不重要吗?并不是,只是我还没细看解读不了罢了 (〃''〃)
那不掌握这些知识,可以出山了吗?可以,只要你把《Java并发编程实践》这本书放在桌子旁边,知道有问题要去看哪部分就可以了,比如你写了一个并发程序,想测试一下,却不知道从何入手,翻开书,看索引,第12章,并发程序的测试,看,学,学以致用,就ok了。

当然,我的解读只是为了帮助大家更好的理解书中的将的知识,所以对于我解读过的章节,大家如果想深入学习,还是要翻开书,研究一番的,只不过在看了我的解读之后,你理解起来会更轻松,学习起来会更有目的性,效率会更高。

为了方便大家阅读。我把我的解读都整理到一份GitBook里头,后续有新的文章也会加在里面:
Java Concurrency in Practice(SexyCode解读版)

其他推荐书籍

不管什么领域,要想全面的学习一项技术,光看一本书都是不够的。
如果说学习《Java并发编程实践》这本权威经典之作,是给自己搭建了一个Java多线程的知识框架的话,那么看其他作者写的同主题的书,就是主动的寻求对已有框架的进一步验证和冲击

那么还有什么Java多线程书值得去看一看呢?
《Java并发编程实践》中,用的是常规的视角来讲Java多线程的,所谓常规,就是由浅到深,层层递进。而我们也可以换一个视角,比如用设计模式的视角来学习。用这个视角来讲Java多线程的开山鼻祖,应该是Doug Lea的Concurrent Programming in Java - Design Principles and Pattern ,不过老人家毕竟水平太高,写的文章一般人看不懂,所以就有了日本人写的图解Java多线程设计模式,以及我们中国人写的Java多线程编程实战指南(设计模式篇),大家可以选择其中一本进行学习,从一个不一样的视角,看待Java多线程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容