[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAwEsYPZ-1661534116043)(img/\1625573175405.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0I9YvFa5-1661534116044)(img/\1625573176080.jpg)]
版权相关注意事项:

1 、书籍版权归著者和出版社所有

2、本PDF来自于各个广泛的信息千台,经过整理而成3、本PDF仅限用于非商业用途或者个人交流研究学习使用4、本PDF获得者不得在互联网上以任何目的进行传播5、如果觉得书籍内容很赞,请一定购买正版实体书,多多支持编写高质量的图书的作者和相应的出版社!当然,如.果图书内容不堪入目,质量低下,你也可以选择狠狠滴撕裂本PDF6、技术类书籍是拿来获取知识的,不是拿来收藏的,你得到了书籍不意味着你得到了知识,所以请不要得到书籍后就觉得沾沾自喜,要经常翻阅!!经常翻阅7、请于下载PDF后24小时内研究使用并删掉本PDF
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rmLxayz-1661534116046)(img/\1625573177353.jpg)]仅供"l0 il’li业用j主或交流学习位用熙男~~唔叩.并发编程. & ~ 霍陆续薛宾田著 , 、、、·、中国工信出版集团 国黠挤坐捉住f_J 、-、I - •a .-- 1 1 , I 、 、_,仅供扑商业Jlj j主必交流’乎习使川
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myqJmFbz-1661534116047)(img/\1625573180293.jpg)]仅供非商业用途成交流’7习仪JH霍陆续薛宾田著~手立专也版性·Publishing House of Electronics Industry 北京•BEIJINGI J '--- 飞’I ‘’-• • …- 'I 、 、J , 仅供非阴业用i盘或交流学斗使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rh0UVEt7-1661534116048)(img/\1625573181177.jpg)]仅供非商业用途或交流学习使用内容简介并发编程相比 Java 中其他知识点的学习门槛较高,从而导致很多人望而却步。 但无论是职场面试,还是高并发 /高流量系统的实现,却都离不开并发编程,于是能够真正掌握并发编程的人成为了市场迫切需求的人才。

本书通过图文结合、通俗易懂的讲解方式帮助大家完成多线程并发编程从入门到实践的飞跃!全书分为三部分,第一部分为 Java 并发编程基础篇,主要讲解 Java 并发编程的基础知识、线程有关的知识和并发编程中的其他相关概念,这些知识在高级篇都会有所使用,掌握了本篇的内容,就为学习高级篇奠定了基础 ;

第二部分为 Java 并发编程高级篇,讲解了 Java 并发包中核心组件的实现原理,让读者知其然,也知其所以然,熟练掌握本篇内容,对我们在日常开发高并发、高流量的系统时会大有禅益 ; 第三部分为 Java 并发编程实践篇,主要讲解并发组件的使用方法,以及在使用过程中容易遇到的问题和解决方法。

本书适合 Java 初级、中高级研发工程师,对 Java 并发编程感兴趣,以及希望探究只JC包源码原理的人员阅读。

未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

版权所有,侵权必究。

图书在版编目(CIP)数据Java 并发编程之美 /瞿陆续,薛宾田著.一北京 · 电子工业出版社, 2018.11ISBN 978-7-121-34947-8 I . ① J… E , ①理… ②薛 . . ill. ① JAVA 语言 -程序设计 IV. ① TP3l2中国版本图书馆 CIP 数据核字 (2018) 第 199378 号策划编辑 :刘 胶责任编辑: 牛 勇印 刷: 三河市华成印务有限公司装 订 : 三向市华成印务有限公司出版发行: 电子工业出版社北京市海淀区万寿路 1 73 信箱 邮编: 100036开 本: 787 x 980 1/16 印张: 22.5 字数: 432 千字版 次: 2018 年 l l 月第 l 版印 次: 2018 年 l l 月第 l 次印刷定价: 89 . 00 元凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。 若书店售缺, 请与本社发行部联系,联系及邮购电话 : ( 0 I 0 ) 88254888, 88258888 。

质量投诉请发邮件至 zlts@phei.com.cn , 盗版侵权举报请发邮件至 dbqq@phei.com.cn。

本书咨询联系方式 : 0 I 0-51260888-819 , faq@phei . com.cn。

GV 仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTAgTMhC-1661534116048)(img/\1625573182046.jpg)]仅供二II'商业用途或交流学习侦ITJ业界好评Java 的并发编程太重要,又太迷人,所以自 Goetz 的 Java ConcwTency in Practice 在

2006 年出版, 2012 年重译以来, 国内的众多作者又陆陆续续出版了若干本相关主题的书籍。

那我手上的这本,是又一本 Java 并发编程 (Yet Another … )吗?为了找一个大家再次购买的理由 , 我快速翻完了全书。

显而易见, 作者是一位喜欢用代码说话的同学,第一部分基础知识中的每个知识点都伴随一段简短的示例及证明的代码,代码不撒谎。

作者对代码的爱,也带到了第二部分。 书中针对 Java 并发库中的主要组件,进行了代码级的原理讲解, 而且紧贴时代脉搏, 涵盖了 JDK 8 的内容。 如果你能耐下心来,跟随作者进行一番代码级的探究,所产生的印象比阅读文章、死记结论, 无疑要深刻得多 。

到了最后的实践部分,依然没有模式、 架构之类的宏大叙事, 而是作者自己一个个的实践例子。

所以,如果要简单概括,这就是一本有好奇心的 Coder,写给另一位有好奇心的Coder 的 Java 并发编程书。

一一肖桦(江南白衣),唯品会资深架构师,公众号“春天的旁边”JDK 1 . 5 之前, 我们必须自己编写代码实现一些并发编程的逻辑 ; 之后到了 JDK 1.5, Doug Lea 解救了广大 Java 用户 , 在 JDK 里特意设计并实现了一套阳C 的框架,给大家提供了非常好的并发编程体验。 本书作者在阿里经历过大量并发的场景,积攒了不少并发编程的经验,并毫无保留地写入本书。 通过书中对 JUC 源码的解读,读者可以揭开 JUC 的神秘面纱。 这是一本值得仔细品读的好书。

一一你假笨 / 寒泉子, Per队!fa CEO,公众号“你假笨”φ仅供非商业用途或交流学习伎m
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1L0yXRBV-1661534116049)(img/\1625573182962.jpg)]仅供非商业用途或交流学习使用IV I Java并发编程之美Java 并发编程所涉及的知识点比较多,多线程编程所考虑的场景相对比较复杂,包括线程间的资源共享、 竞争、 死锁等问题。 并发编程相比 Java 中其他知识点,学习起来门槛相对较高,学习难度较大,从而导致很多人望而却步。 加多的 《Java 并发编程之美》这本书刚好填补了这个空缺, 作者在并发编程领域深耕多年。 本书用浅显易懂的文字为大家系统地介绍了 Java 并发编程的相关内容,推荐大家关注学习 。

纯洁的微笑 , 第二方支付公司技术总监,公众号“纯洁的微笑”Java 并发编程无处不在, Java 多线程、并发处理是深入学习 Java 必须要掌握的技术。

本书涵盖了 Java 并发包中的核心类、 API 以及框架等内容,并辅以详尽的案例讲解,帮助读者快速学习、迅速掌握。 如果你希望成氏为一名优秀的 Java 程序员 , 有必要读一读本书。

一一许令泼, 《深入分析 Java Web 技术内幕》 作者第一作者加多是一位非常勤奋的技术人员 , 经常发布各种技术文章,有时候甚至能做到每天一篇,在并发编程网已经累计发布了近百篇文章。 本书是他多年的积累,厚积薄发,从并发编程的基础知识一直到实战娓娓道来,希望读者喜欢。

一一方腾飞,并发编程网创始人e 仅供非商业用途或交流学习佼用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFy7gm5f-1661534116050)(img/\1625573184016.jpg)]仅供非商业用途或交流学习使用…1.-… 目。 … E司本书特色不像其他并发类书籍那样晦涩难懂,本书的特色之一是通俗易懂,对 Java 有一定基础的开发人员都可以看懂。 本书在基础篇专门讲解并发编程基础,笔者根据在项目实践中对这些知识的理解,总结了并发编程中常用的基础知识以及常用的概念,并通过图文结合的方式降低理解的难度,使用少量的代码讲解就可以让读者轻松掌握并发编程的基础知识,让读者逐步建立起自信。 在高级篇主要讲解 JUC 井发包下并发组件的实现原理,首先介绍 JUC 里面最简单的原子类,让读者学会使用在基础篇里介绍的最简单的 CAS 操作,再逐步加大难度让读者慢慢适应:比如一开始打算把并发 List 放到锁后面讲解,因为并发List 里面使用了锁,但是锁的理解难度比 List 大太多,所以最终还是坚持从易入难的原则,先讲解 List,再讲解锁。 在实践篇中首先讲解并发组件在开源框架或者项目中的运用,让读者不仅可以知道并发组件的原理,而且可以了解怎么使用这些组件。 最后总结笔者在项目中或者其他同事在项目中经常遇到的并发编程问题,并对其进行分析,给出解决方案。

如果你只想使用并发包,那么可以阅读本书,因为本书在讲解代码时基本都是用的实例 ; 如果你想研究源码却一筹莫展一一不知道如何下手或者感觉吃力,也可以阅读本书,因为本书对核心代码进行了讲解;如果你想了解并发编程中的常见问题,增加对并发的认识, 也可以阅读本书,因为本书对这类问题进行了总结。

如何阅读本书本书分为基础篇、高级篇和实践篇,其中基础篇讲解线程的知识和并发编程中的基本概念以及基础知识,高级篇则介绍并发包下常用的并发组件的原理,实践篇讲解并发组件的具体使用方法和在并发编程中会遇到的一些并发问题及解决方法。

® 仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKw7sEQH-1661534116051)(img/\1625573184831.jpg)]仅供非商业用途或交流学习使用VI I J ava并发编程之美阅读开源框架源码的一点心得为什么要看源码
我们在做项目的时候一般会遇到下面的问题 :
Cl )不知道如何去设计。 比如刚入职场时,来一个需求需做概要设计,不知如何下手,不得不去看当前系统类似需求是如何设计的 , 然后仿照去设计。

( 2)设计的时候,考虑问题不周全。 相比职场新于,这类人对一个需求依靠自己的经验已经能够拿出一个概要设计, 但是设计中经常会遗漏一些异常细节, 比如使用多线程有界队列执行任务,遇到机器岩机了,如果队列里面的任务不存盘的话,那么机器下次启动的时候这些任务就丢失了 。

对于这些问题,说到底主要还是因为经验不够,而经验主要从项目实践中积累,所以招聘单位一般都会限定工作时间大于 3 年,因为这些人的项目经验相对较丰富,在项目中遇到的场景相对较多 。 工作经验的积累来自于年限与实践, 然而看源码可以扩展我们的思路,这是变相增加我们经验的不错方法。 虽然不能在短时间内通过时间积累经验,但是可以通过学习开源框架、开源项目来获取经验。

另外 , 进职场后一般都要先熟悉现有系统,如果有文档还好, 没文档的话就得自己去翻代码研究。 如果之前对阅读源码有经验, 那么在研究新系统的代码逻辑时就不会那么费劲了 。

还有一点就是,当你使用框架或者工具做开发时, 如果你对它的实现有所了解,就能最大化地减少出故障的可能。 比如并发队列 ArrayB!ockingQueue 里面关于元素入队有个offer 方法和 put 方法,虽然某个时间点你知道使用 offer 方法时 , 当队列满了就会丢弃要入队的元素, 之后 offer 方法会返回 false,而不会阻塞当前线程 : 而使用 put 方法时,当队列满了,则会挂起当前线程, 直到队列有空闲 , 元素入队成功后才返回 。 但是人是善忘的,一段时间不使用,就会忘记它们的区别 , 当你再去使用时,需进入 offer 和 put 方法的内部,看它们的源码实现。 进入 offer 方法一看,哦, 原来队列满后直接返回了 false ; 进入 put方法一看, H我,原来队列满后,直接使用条件变量的 await 方法挂起了当前线程。 知道了e它们 的区别,你就可以根据自己的需求来选择了 。

仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0PfgVss-1661534116052)(img/\1625573185706.jpg)]仅供非商业用途或交流学习使用前言 I VII 看源码最大的好处是可以开阔思维, 提升架构设计能力 。 有些东西仅靠书本和自己思考是很难学到的,必须通过看源码,看别人如何设计,然后思考为何这样设计才能领悟到。

能力的提高不在于你写了多少代码,做了多少项目,而在于给你一个业务场景时,你是否能拿出几种靠谱的解决方案,并且说出各自的优缺点。 而如何才能拿出来, 一来靠经验,二来靠归纳总结,而看源码可以快速增加你的经验。

如何看源码那么如何阅读源码呢?在你看某一个框架的源码前,先去 Google 查找这个开源框架的官方介绍,通过资料了解该框架有几个模块,各个模块是做什么的,之间有什么联系,每个模块都有哪些核心类,在阅读源码时可以着重看这些类。

然后对哪个模块感兴趣就去写个小 demo,先了解一下这个模块的具体作用,然后再debug 进入看具体实现。 在 debug 的过程中,第一遍是走马观花,简略看一下调用逻辑,都用了哪些类 ; 第二遍需有重点地 debug , 看看这些类担任了架构图里的哪些功能,使用了哪些设计模式。 如果第二遍有感觉了,便大致知道了整体代码的功能实现,但是对整体代码结构还不是很清晰,毕竟代码里面多个类来回调用,很容易遗忘当前断点的来处;那么你可以进行第三遍 debug,这时候你最好把主要类的调用时序图以及类图结构画出来,等画好后,再对着时序图分析调用流程,就可以清楚地知道类之间的调用关系,而通过类图可以知道类的功能以及它们相互之间的依赖关系。

另外,开源框架里面每个功能类或者方法一般都有注释,这些注释是一手资料,比如JUC 包里的一些并发组件的注释,就已经说明了它们的设计原理和使用场景。

在阅读源码时,最好画出时序图和类图,因为人总是善忘的 。 如果隔一段时间你再去看之前看过的源码,虽然有些印象,但当你想去看某个模块的逻辑时,又需根据 demo 再从头 debug 了 。 而如果有了这俩图,就可以从这俩图里面直接找,并且看一眼时序图就知道整个模块的脉络了 。

此外,查框架使用说明最好去官网查 (这些信息是源头,是没有经过别人翻译的),虽然是英文,但是看久了就好了,毕竟还有 Google 翻译呐 !e 当然研究代码时不一定非要 debug 三遍,其实这里说的是三种掌握程度,如果你debug 一遍就能掌握,那自然更好l啦 。

仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJnNRKCd-1661534116052)(img/\1625573186498.jpg)]仅供二II'商业用途或交流学习侦ITJ目 录第一部分 Java 并发编程基础篇第 1 章并发编程线程基础… … … … … … … … … 2

1.1 什么是线程… . ………… . ··· ···…… ………………… … ……· ………… 2

1.2 线程创建与运行 … … . … … … . … … … . … . … … . . … . … … … . … … … 3

1.3 线程通知与等待 ···· · ······ · ·········· · ·· ··· ·· ······ ·················· · ··· · ·· ··· · · ······ · ··· · ··· · ·························· 6

1.4 等待线程执行终止的 join 方法… … … . … … … … 16

1.5 让线程睡眠的 sleep 方法……… . … … … … … … . … … … 19

1.6 让出 CPU 执行权的 yield 方法 … . … … … . … … . . … … … . … … 23

1.7 线程中断·· ··· ······· … … … … ……………… … .…·…… … … .……… ……. … ………… 24

1.8 理解线程上下文切换……………………………………………E………………. . … . … . …如

山线程死锁… … . … … … … 30

30

I 9.2 如何避免线程死锁… .…… .… · …………………… 33 I 10 守护线程与用户线程…………………………………………………… 35

1.11 ThreadLocal … … … … … 39

1.11.1 ThreadLocal 使用示例. … … … . … … . … . … … … . … … … . … 40

1.11 2 ThreadLocal 的实现原理....…············· · · · ····…··…… ……… … . … . . . … 42

1.11.3 ThreadLocal 不支持继承性................. … 45

1.11.4 InheritableThreadLocal 类 , ···· · · · ····· ·· · · ······ · · · ···· · ···· · ·· · ·· · ···· · ……………… . … … . . . … 46

第 2 章并发编程的其他基础知识… … …………. … … . ……………… 50

2.1 什么是多线程并发编程… … … … . .…… … … . ……· ·············……………… 50

2.2 为什么要进行多线程并发编程… … … … . … . … 51

2.3 Java 中的线程安全问题....…… . …………………………… . .……… 51

φ仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBPZudG6-1661534116053)(img/\1625573187553.jpg)]目录 I IX

2.4 Java 中共享变量的内存可见性问题… . … . … . … . … . … … … … . .……………… 52

2.5 Java 中的 synchronized 关键宇······ · · · ········· · ·…… . … . … … …… … … … .………… … … … … 54

2.5. 1 synchronized 关键字介绍… . … . . . … … … … … … … … … … … . . … 54

55

2.6 Java 中的 volatile 关键宇… … … . . … ……………··…………… … . . . …………… …… … 55

2.7 Java 中的原子性操作…… . ………·········…… … ……………………………… 57

2.8 Java 中的 CAS 操作… … ……… . ……… ……… … … … .…………………. . … . … . …… 59

2 9 Unsafe 类 . . . … . … … … . ………………………………·…………··”

2.9. 1 Unsafe 类中的重要方法… … . … . . . … … … … . .…………· ………… … .…………… … 59

61

2.10 Java 指令重排序,……………………………. . … . . . .……………… . … … … … … . … 65

2.11 伪共享 … . . . . . … … … … . … . … . … . …… … ………. … … … . ……… … 67

2 11.1 什么是伪共享..· -……………………………………… … . …… … … 67

2.11.2 为何会出现伪共享..... . ..... . . . ... . . . ... . .... . ..… … . … . . . . . ……… … . . . . …………·· 68

2.11.3 如何避免伪共享 . . . … . … , ………… … .… ………………………… 70

2 11.4 小结.... …………… ………………… …………………. … ……… .……… 72

2.12 锁的概述 … . . … . . . ………………… . . … ……·······…… … ……… … … 72

2 12 1 乐观锁与悲观锁… … . . … . ……………··………… . ……… … … . … 72

  1. 12.2 公平锁与非公平锁........ .... .. .. . . …… ……………………………… … 75

2.12 3 独占锁与共享锁…………………………··………··… . … . … . .…… … … 75

2.12.4 什么是可重入锁... . . ……·· · ·· ·… … . . . . … . …… . … ………………· ·…… . … 76

2.12.5 自旋锁… . ……………………… . … . ………. . … . … 77

2.13 总结… . ……·…………………… · ········· ·· ·……··……… . …………… ·· ····· · ······ · … . … 77

第二部分 Java 并发编程高级篇第 3 章 Java 并发包中 Th read Local Random 类原理剖析. … ……… . . 80

3 1 Random 类及其局限性… . … . … ·· ····· ·· ····…………………… ……… … ………… … 80

3 2 ThreadLocalRandom ………… … … ……………… … ………·…… … … 82

3 3 源码分析… . …………… ……········· ···…··……… . ……………………… … … … … … … 84

34 总结. … … … … … … . . … … . . ……………………………··……… 87
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2xYztGrE-1661534116054)(img/\1625573188471.jpg)]X I Java并发编程之美第 4 章 Java 并发包中原子操作类原理剖析··········· ····· ··········…… … … 88

4.1 原子变量操作类… . ····· … … … ………………………………… 88

4.2 JDK 8 新增的原子操作类 LongAdder … … … … … … … … … … … 93

93

95

l 0 l

4.3 LongAccumulator 类原理探究·· · · · · ·· ······ ·· ·· ·· · · · ···· · · · ···· ····· ·· ······ ················· · ·· · · ········· · · 102

4.4 总结……… … . . ……. . ……… … … … … … . . . … … … . . … 104

第 5 章 Java 并发包中并发 List 源码剖析....... .………………… 105

5.2 主要方法源码解析… … … … … … … . … . … … …………………… … … .…… 106

106

106

108

109

…………………………… 110

111

5.3 总结… . … . … … … … … … 114

第 6 章 Java 并发包中锁原理剖析………………… . 115

6.1 LockSuppo口 工具类 … . . ····· ········· ·· ·……………… … … … … … … 115

6.2 抽象同步队列 AQS 概述… . ……………………………… · · ···· ··········…… . … 122

…… ·· . .. .... . ... . ..... .. .... .... 122

128

131

6.3 独占锁 ReentrantLock 的原理… … … … . … . … … … . .…… … … 136

6.3 .1 类图结构… … … … … … … . … … . … …………… … …………………… 136

6.3 .2 获取锁 . . …… . … ………… ……… … . ……… ………···· · · · …··……………………… 137

142

143

145

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xjNCiKxy-1661534116056)(img/\1625573189386.jpg)]目录 I XI

6.4 读写锁 ReentrantReadWriteLock 的原理… … . ……… . .…… 145

145

147

15 l

156

158

6.5 JDK 8 中新增的 StampedLock 锁探究....…………… … . . ……… . … … 158

6.5 .1 概述… . … . … . ………………… ………………… 158

160

,… 164

第 7 章 Java 并发包中并发队列原理剖析 … . … … … … ……………… 165

7 .1 ConcurrentLinkedQueue 原理探究… . … . ……… … … . … . … . … … … . … 165

7.1 I 类图结构… . ……… ……………. . … . … 165

7 .1.2 ConcurrentLinkedQueue 原理介绍........ ..………………… 166

7.l 3 小结… . . … … . . …………… . .…………… . ……… . … . . . … . … … . 181

7.2 LinkedBlockingQueue 原理探究… . … . … . … … … . … … … . … … … . … 182

182

185

723 小结 .... … … … … … … … … … . … . . … 194

7.3 ArrayBlockingQueue 原理探究 ……. . . ………… . … . … 195

195

197

202

7.4 PriorityBlockingQueue 原理探究....………… . ……… … . … . … … … . . … . … . … . … . 203

203

205

214

216

7.5 DelayQueue 原理探究……… .…… . … . …… ……. . … . ……… . … … . . … … . . …. . … 217

7 .5 .1 DelayQueue 类图结构. … ………… … … … 217

219

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNxDFsHs-1661534116057)(img/\1625573190187.jpg)]XII I Java并发编程之美

222

224

第 8 章 Java 并发包中线程池 Th read Pool Executor 原理探究. . … … … 225

8.1 介绍. . ……………··········· · · · · ·………·· ··············……… … … 225

8.2 类图介绍 ……······· · ··· · ····· ·· · · ······· · ······ ·· · ·· ···…… . … . … . . . … … … … … . … 225

8.3 源码分析…………… ……················· … … … … … 230

230

235

238

240

241

8.4 总结····· · ···…… … ……… … .………… … … … 242

第 9 章 Java 并发包中 ScheduledThreadPoolExecutor 原理探究… 243

9.1 介绍. . ... ………………………………………… … … . . 243

92 类图介绍… . . . … . … … … . … … … . … 243

9.3 原理剖析.......................... .. ............ . ...………………………… 245

246

2 scheduleWithFixedDelay(Runnable command,long initia!Del町, long delay,

T1meUmt umt)方法… … . … . . … … . … . … 252

3 sch巳duleAtFixedRat巳(Runnable comman

Time Unit unit)方法… . … … … … . . … . … . … . … 254

9.4 总结 . . … … … . . … . … . . … … . … . ……… .…. … … … 255

第 10 章 Java 并发包中线程同步器原理剖析……… . … . ……… . … 256 10.1 CountDownLatch 原理剖析 … … … … ……………………………… … … . … 256 10.1.1 案例介绍………………………… . . . … . . . … . … … … . . … … . … . … … … 256 10 1.2 实现原理探究....... . . ........... . ............ . ....………………··…… 259 10.1.3 小结…E…. . … E………………………… . ………… . ………… E……………………………………. . … 263 10.2 回环屏障 CyclicBarrier 原理探究… . … . ……………………………… 264 10.2 1 案例介绍.......... ……………………… … ……… 264 10.2.2 实现原理探究… . … . … . … . … . … … . … . . . … . . … . … . … … . . . … . . … . … . . . … 268 10.2.3 小结……………··…………. . . . … . . . …… · · · ··………… . . . ………………………………………….272
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6r3gw7td-1661534116058)(img/\1625573191033.jpg)]目录 IX川10.3 信号量 Semaphore 原理探究… . … … … . … … … . … … … . … . … . … … . … … . … … 272 10 3.1 案例介绍… . … … … . ………………………. … ……… . … … . … … 272 10.3 .2 实现原理探究.... . .... .... . .. . ..............................………… . ………… … . . … … 276 10.3 3 小主主… . . … . … … … . . ……··· · ······ · · · ·· ···· · · · · …… . . ……………….28110.4 总结… . …………………········……·…………………··············· ·· ······ · ····· 281 第三部分 Java 并发编程实践篇第 11 章并发编程实践… ··········· ··········………………………… . 284 11.1 ArrayBlockmgQueue 的使用···················……… . ……………………………… . 284 11.1.1 异步日志打印模型概这………………………………… . . … … .………… . … 284 11.1 2 异步日志与具体实现…………………… . … . . ………… · · · · ·····………· - 285 11.1.3 小结……… ………… ............ .. . . ....... … ····· · … … 293 11.2 Tomcat 的 NioEndPoint 中 ConcurrentLinkedQueue 的使用… . … … … … 293 11.2.1 生产者一-Acceptor 线程… . . . … … . … ···· ·········································· ··· ······… 294 11.2.2 消费者一-Poller 线程.... ... .. ...…… . . … … . … . … . … . . … . … … . . … 298 11 2.3 小结.......................………………………………… . … 300 11.3 并发组件 ConcurrentHashMap 使用注意事项… … . … … ………. . … . . .………… … … 300 11.4 SimpleDateF ormat 是线程不安全的.…·· · ················· · ·· · ··· · ·········· · ·· ····· ··········· ······ 304 11 4. 1 问题复现… … . . .…………. ··· ····…………………………………… 304 11.4.2 问题分析…··· · ················…·…………… . … . … . … 305 11.4.3 小结............. . .........……… . … . . . … . … . … … … . … 309 11.5 使用 Timer 时需要注意的事情… . … . … . … . … . .…·········…………. … 309 11.5.1 问题的产生,… . … . ……………. . . . ……. … … . … … … . . … … . . … . … . … 309 11.5.2 Timer 实现原理分析.... .. ... .. . ......…………………………… 310 11.5.3 小结……………········· … … … … ……………………… 313 11.6 对需要复用但是会被下游修改的参数要进行深复制… . … . … … . … . … . . … . . … 314 11.6 I 问题的产生… . … . … . . … . . ……… . ……… . ………………………… . ….... ... .. . ... 314 11.6.2 问题分析……………………………………………………··· · ··…………… 316 11.6 3 1J 、 结...........………………………………… ………… . . . … . … 318 11.7 创建线程和线程池时要指定与业务相关的名称… . . … . … . … . … … . . . … … 319 11.7.1 创建线程需妥有线程名… … . . …· · ········ ·· · · …… ……… . … . . . … . … . … . … 3 山
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hqKcilZ-1661534116059)(img/\1625573191866.jpg)]×IV I Java并发编程之美11.7.2 创建线程池时也需要指定线程池的名称...... .. . … … … … … … 321 11.7 3 小结 … . … … . . … … ………………… … . 325 11.8 使用线程池的情况下当程序结束时记得调用 shutdown 关闭线程池 … … . … 325 11.8.1 问题复现 … … … … … … … … … … … … . 325 11.8 2 问题分析 … … … .…… ……………………… …………… … … … . 327 11.8.3 小结. .. ……………- …………………… .…. … … … … … … … 329 11.9 线程池使用 FutureTask 时需要注意的事情 … … … …… … … .……… . … . … . … . … … 329 11 9.1 问题复现·· ·· ······ · ···· ……… … … … … . . .………. … ……………… . … . . … . . … 329 11.9.2 问题分析… … .……………. . . . . . ··· ······· ····· · . … … … … . … . … … 332 11 9.3 小主主 . . . … … … … … … … … … … …………………………… ……. … 335 11.10 使用 ThreadLocal 不当可能会导致内存泄漏…… . … . . . … . . . … … .……. . . . … … … … … … … 336 11.10.1 为何会出现内存泄漏… . . ···· ···· ······ ···…………… … … … … . 336 11.10.2 在线程池中使用 ThreadLocal 导致的内存泄漏...........…… … … . … … 339 11.10.3 在 Tomcat 的 S巳凹let 中使用 ThreadLocal 导致内存泄漏 . … . … . . … . . … 341 11.10.4 小结…………………………-…………………………· …… … 344 11.11 总结… . ……······ ·· · ·····………… . ······ · … … ………… ……… … … … … … … … … . 344
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GjBw6oEy-1661534116060)(img/\1625573192702.jpg)]第一部分Java并发编程基础篇本篇主要介绍并发编程的基础知识,包含两章内容, 分别为并发编程线程基础以及并发编程的其他概念与原理解析。

仅jj\非商业用途或交流学习伎JjJ
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ov2ohgri-1661534116061)(img/\1625573193457.jpg)]第1章并发编程线程基础

1.1 什么是线程

在讨论什么是线程前有必要先说下什么是进程,因为线程是进程中的一个实体,线程本身是不会独立存在的。 进程是代码在数据集合上的一次运行活动 , 是系统进行资源分配和调度的基本单位, 线程则是进程的一个执行路径, 一个进程中至少有一个线程,进程中的多个线程共享进程的资源。

操作系统在分配资源时是把资源分配给进程的, 但是 CPU 资源比较特殊, 它是被分配到线程的 , 因为真正要占用 CPU 运行的是线程, 所以也说线程是 CPU 分配的基本单位。

在 Java 中,当我们启动 main 函数时其实就启动了一个口!M 的进程, 而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。

进程和线程的关系如图 1 - 1 所示。

进恕! 回国 l I· 蛐 I 国 1-1仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cP2e5cE7-1661534116062)(img/\1625573194279.jpg)]第1章并发编程线程基础 I 3 由图 1-1 可以看到, 一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和技区域。

程序计数器是一块内存区域,用来记录线程当前要执行的指令地址。 那么为何要将程序计数器设计为线程私有的呢?前面说了线程是占用 CPU 执行的基本单位,而 CPU 一般是使用时间片轮转方式让线程轮询占用的,所以当前线程 CPU 时间片用完后,要让出CPU,等下次轮到 自 己的时候再执行。 那么如何知道之前程序执行到哪里了呢?其实程序计数器就是为了记录该线程让出 CPU 时的执行地址的,待再次分配到时间片时线程就可以从自己私有的计数器指定地址继续执行。 另外需要注意的是,如果执行的是 native 方法,那么 pc 计数器记录的是 undefined 地址,只有执行的是 Java 代码时 pc 计数器记录的才是下一条指令的地址。

另外每个线程都有自 己的战资源,用于存储该线程的局部变量,这些局部变量是该线程私有的,其他线程是访问不了的,除此之外枝还用来存放线程的调用技帧。

堆是一个进程中最大的一块内存,堆是被进程中的所有线程共享的,是进程创建时分配的,堆里面主要存放使用 new 操作创建的对象实例。

方法区则用来存放 NM 加载的类、常量及静态变量等信息,也是线程共享的 。

1.2 线程创建与运行

Java 中有三种线程创建方式,分别为实现 Runnable 接口的 run 方法,继承 Thread 类并重写 run 的方法,使用 Fu阳reTask 方式。

首先看继承 Thread 类方式的实现。

p ublic c l ass ThreadTest { //继承Thread类并重写ru口方法publ工c static class MyThread ext ends Th read { @Override public v o id r un () { System . out . pr工nt l n ( ” I am a chi l d thr ead" ) ; 仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsgrDU49-1661534116063)(img/\1625573195084.jpg)]

4 I Java并发编程之美

public static void main (String[] args ) { //创建线程MyThread thread= new MyThread (); // 启动线程thread .start(); 如上代码中的 MyThread 类继承了 Thread 类,并重写了 run() 方法。在 main 函数里面创建了一个 MyThread 的实例,然后调用该实例的 start 方法启动了线程。需要注意的是,当创建完 thread 对象后该线程并没有被启动执行,直到调用了 start 方法后才真正启动了线程。

其实调用 start 方法后线程并没有马上执行而是处于就绪状态, 这个就绪状态是指该线程已经获取了除 CPU 资源外的其他资源,等待获取 CPU 资源后才会真正处于运行状态。

一旦 run 方法执行完毕, 该线程就处于终止状态。

使用继承方式的好处是, 在 run() 方法内获取当前线程直接使用 this 就可以了,无须使用 Thread.currentThread() 方法 ; 不好的地方是 Java 不支持多继承,如果继承了 Thread 类,那么就不能再继承其他类。另外任务与代码没有分离, 当多个线程执行一样的任务时需要多份任务代码,而 Runable 则没有这个限制。下面看实现 Runnable 接口 的 run 方法方式。

public static class RunableTask implements Runnable{ @Override public void run( ) { System.out.println ( ” I am a ch工ld thread" ) ; public static void main(String[] args) throws I口terruptedException{RunableTask task =口ew RunableTιs k (; new Thread(task) . start() ; new Thread(task) . start() ; 仅供非商业用途或交流学习使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aijcJoNe-1661534116065)(img/\1625573195908.jpg)]仅供非商业用途或交流学习使用第1章并发编程线程基础 I s 如上面代码所示,两个线程共用一个 task 代码逻辑,如果需要,可以给 RunableTask添加参数进行任务区分。另外, RunableTask 可以继承其他类。但是上面介绍的两种方式都有一个缺点,就是任务没有返回值。 下面看最后一种,即使用 FutureTask 的方式。

//创建任务类,类似Runablepublic stat工c class CallerTask impleme口ts Callable<Str工ng>{@Overr工depubl工C Str工ng call () throws Except工on { return "hello ”, public static void main(String[) args) throws InterruptedException { // 创建异步任务FutureTask<Str工ng> futureTask =口ew FutureTask<>(new CallerTask()) ; //启动线程new Thread ( futureTask) . start () ; try { //等待任务执行完毕,并返回结果String result = futureTask.get (); System . out . printl口( result )

《Java并发编程之美》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. Redis NoSQL
  2. HDU2608 0 or 1
  3. android listview中item通过viewpager实现
  4. MaxCompute 存储设计
  5. 【杭州云栖】边缘计算ENS:拓展云的边界
  6. [转载] KAFKA分布式消息系统
  7. DEKR 解构式人体关键点回归(二):标签分配(Label Assignment)
  8. Pandas选择行列的十大技能
  9. Redis 6.0 源码阅读笔记(5) -- List 数据类型源码分析
  10. flash activex java_Flash Activex NPAPI PPAPI 各种网页插件完整安装包下载地址
  11. 爬虫抓取百度指数思路总结
  12. 非语言沟通:超越字词之外的信息(非语言沟通的诸多作用和具体种类)
  13. android无法格式化sd卡,手机sd卡无法格式化怎么回事?手机sd卡无法格式化解决方法...
  14. 解决安卓机拍照,照片显示自动旋转90度问题
  15. openbci/bciduino脑电放大器lsl数据解释
  16. 【音频】削波失真(爆音)问题定位与解决
  17. 空指针异常可能出现的原因
  18. 不可重复读和幻读有什么区别?
  19. 卸载mysql5.6.34_5.6.34版本安装后需要做的事项\mysql\.\innodb_table_stats\ not found.-hxl-ChinaUnix博客...
  20. 数据科学家技能树(中文翻译版)

热门文章

  1. 在ios中fixed定位元素丢失,Date兼容NaN
  2. 梅尔罗斯百度云在线观看迅雷下载Patrick Melrose磁力BT下载
  3. 姚班大神胡渊鸣回国创业!超一半员工为清华校友,团队人均竞赛金牌数≥2
  4. module ‘gast‘ has no attribute ‘Num‘ 警告
  5. 木头的 blog 。
  6. Python之数据结构
  7. c语言 printf分栏输出,Exce表格分栏打印输出的方法
  8. Golang依赖下载安装失败解决方法
  9. 如何一次获取多个Word文档的页数
  10. 【QT开发专题-天气预报】15. 解析天气数据