新書推薦:
![广东当代金融史:全三册](http://103.6.6.66/upload/mall/productImages/24/11/9787520330732.jpg)
《
广东当代金融史:全三册
》
售價:HK$
717.6
![养育的觉醒:全面激发孩子自驱力,教你如何心平气和做妈妈](http://103.6.6.66/upload/mall/productImages/24/11/9787505757981.jpg)
《
养育的觉醒:全面激发孩子自驱力,教你如何心平气和做妈妈
》
售價:HK$
58.8
![1368:历史岔道口的抉择与国运盛衰](http://103.6.6.66/upload/mall/productImages/24/11/9787522517032.jpg)
《
1368:历史岔道口的抉择与国运盛衰
》
售價:HK$
69.6
![全球城市发展报告2023:基于全球城市网络的合作与竞争](http://103.6.6.66/upload/mall/productImages/24/11/9787543235458.jpg)
《
全球城市发展报告2023:基于全球城市网络的合作与竞争
》
售價:HK$
273.6
![为什么只见树木不见森林:从简单现象到复杂系统](http://103.6.6.66/upload/mall/productImages/24/11/9787500173960.jpg)
《
为什么只见树木不见森林:从简单现象到复杂系统
》
售價:HK$
94.8
![大英帝国的兴衰:跨越海洋 征服世界](http://103.6.6.66/upload/mall/productImages/24/11/9787505757615.jpg)
《
大英帝国的兴衰:跨越海洋 征服世界
》
售價:HK$
117.6
![意大利文艺复兴新艺术史](http://103.6.6.66/upload/mall/productImages/24/10/9787558087233.jpg)
《
意大利文艺复兴新艺术史
》
售價:HK$
958.8
![2023年《咬文嚼字》合订本(精)](http://103.6.6.66/upload/mall/productImages/24/11/9787532189465.jpg)
《
2023年《咬文嚼字》合订本(精)
》
售價:HK$
93.6
|
編輯推薦: |
1 内容脉络清晰,讲解循序渐进,介绍系统全面。围绕多线程编程所要解决的问题及其面临的挑战,展开介绍多线程编程中的相关概念、原理与技术。
2 包含丰富的实战案例和生活化实例,案例配有源码,并且这些源码可以实际运行,方便读者实验。
3 书中包含提示、扩展阅读等内容,以问答的形式解答多线程编程初学者经常遇到的一些疑惑和问题。
|
內容簡介: |
随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了——如今就连智能手机这样的消费类设备都已配备了4核乃至8核的处理器,更何况商用系统!在此背景下,以往靠单个处理器自身处理能力的提升所带来的软件计算性能提升的那种“免费午餐”已不复存在,这使得多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。故而,掌握多线程编程技能对广大开发人员的重要性亦由此可见一斑。本书以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及相关工具。
|
關於作者: |
黄文海,2004年开始从事软件开发工作,近几年从事软件项目管理工作。在其工作过程中积累了丰富的技术指导经验和企业内部培训经验。曾在InfoQ中文站和IBM developerWorks上发表过十几篇技术、项目管理文章。
|
目錄:
|
目录
第一部分多线程编程基础
第1章走近Java世界中的线程2
1.1进程、线程与任务2
1.2多线程编程简介4
1.2.1什么是多线程编程4
1.2.2为什么使用多线程4
1.3Java线程API简介5
1.3.1线程的创建、启动与运行5
1.3.2Runnable接口9
1.3.3线程属性12
1.3.4Thread类的常用方法14
1.3.5Thread类的一些废弃方法16
1.4无处不在的线程17
1.5线程的层次关系19
1.6线程的生命周期状态21
1.7线程的监视22
1.8多线程编程简单运用实例26
*1.9多线程编程的优势和风险27
1.10本章小结29
第2章多线程编程的目标与挑战31
2.1串行、并发与并行31
2.2竞态33
2.2.1二维表分析法:解释竞态的结果37
2.2.2竞态的模式与竞态产生的条件39
2.3线程安全性42
2.4原子性43
2.5可见性49
2.6有序性56
2.6.1重排序的概念56
2.6.2指令重排序57
2.6.3存储子系统重排序63
2.6.4貌似串行语义66
2.6.5保证内存访问的顺序性68
2.7上下文切换69
2.7.1上下文切换及其产生原因69
2.7.2上下文切换的分类及具体诱因70
2.7.3上下文切换的开销和测量71
2.8线程的活性故障73
2.9资源争用与调度74
2.10本章小结77
第3章Java线程同步机制80
3.1线程同步机制简介80
3.2锁概述81
3.2.1锁的作用82
3.2.2与锁相关的几个概念84
3.2.3锁的开销及其可能导致的问题86
3.3内部锁:synchronized关键字86
3.4显式锁:Lock接口89
3.4.1显式锁的调度91
3.4.2显式锁与内部锁的比较92
3.4.3内部锁还是显式锁:锁的选用95
*3.4.4改进型锁:读写锁95
3.5锁的适用场景99
3.6线程同步机制的底层助手:内存屏障99
*3.7锁与重排序102
3.8轻量级同步机制:volatile关键字105
3.8.1volatile的作用105
3.8.2volatile变量的开销111
3.8.3volatile的典型应用场景与实战案例111
3.9实践:正确实现看似简单的单例模式120
3.10CAS与原子变量126
3.10.1CAS127
3.10.2原子操作工具:原子变量类129
3.11对象的发布与逸出135
3.11.1对象的初始化安全:重访final与static137
3.11.2安全发布与逸出142
3.12本章小结143
第4章牛刀小试:玩转线程148
4.1挖掘可并发点148
4.2新战场上的老武器:分而治之148
4.3基于数据的分割实现并发化149
4.4基于任务的分割实现并发化158
4.4.1按任务的资源消耗属性分割159
4.4.2实战案例的启发169
4.4.3按处理步骤分割171
4.5合理设置线程数172
4.5.1Amdahl's定律172
4.5.2线程数设置的原则173
4.6本章小结177
第5章线程间协作179
5.1等待与通知:waitnotify179
5.1.1waitnotify的作用与用法180
5.1.2waitnotify的开销及问题188
5.1.3Object.notifynotifyAll的选用191
*5.1.4waitnotify与Thread.join191
5.2Java条件变量192
5.3倒计时协调器:CountDownLatch198
5.4栅栏(CyclicBarrier)203
5.5生产者消费者模式210
5.5.1阻塞队列213
5.5.2限购:流量控制与信号量(Semaphore)216
*5.5.3管道:线程间的直接输出与输入218
5.5.4一手交钱,一手交货:双缓冲与Exchanger221
5.5.5一个还是一批:产品的粒度223
5.5.6再探线程与任务之间的关系224
5.6对不起,打扰一下:线程中断机制225
5.7线程停止:看似简单,实则不然228
5.7.1生产者消费者模式中的线程停止233
5.7.2实践:Web应用中的线程停止233
5.8本章小结236
第6章保障线程安全的设计技术240
*6.1Java运行时存储空间240
6.2大公无私:无状态对象243
6.3以不变应万变:不可变对象248
6.4我有我地盘:线程特有对象254
6.4.1线程特有对象可能导致的问题及其规避258
6.4.2线程特有对象的典型应用场景264
6.5装饰器模式265
6.6并发集合267
6.7本章小结270
第7章线程的活性故障273
7.1鹬蚌相争:死锁273
7.1.1死锁的检测274
7.1.2死锁产生的条件与规避283
7.1.3死锁的恢复296
7.2沉睡不醒的睡美人:锁死301
7.2.1信号丢失锁死301
7.2.2嵌套监视器锁死301
7.3巧妇难为无米之炊:线程饥饿307
7.4屡战屡败,屡败屡战:活锁307
7.5本章小结308
第8章线程管理310
8.1线程组310
8.2可靠性:线程的未捕获异常与监控311
8.3有组织有纪律:线程工厂316
8.4线程的暂挂与恢复318
8.5线程的高效利用:线程池320
8.5.1任务的处理结果、异常处理与取消326
8.5.2线程池监控329
8.5.3线程池死锁330
8.5.4工作者线程的异常终止330
8.6本章小结331
第9章Java异步编程333
9.1同步计算与异步计算333
9.2Java Executor框架336
9.2.1实用工具类Executors337
9.2.2异步任务的批量执行:CompletionService339
9.3异步计算助手:FutureTask344
9.3.1实践:实现XML文档的异步解析345
9.3.2可重复执行的异步任务349
9.4计划任务352
9.5本章小结358
第10章Java多线程程序的调试与测试360
10.1多线程程序的调试技巧360
10.1.1使用监视点360
10.1.2设置暂挂策略361
10.2多线程程序的测试363
10.2.1可测试性364
10.2.2静态检查工具:FindBugs369
10.2.3多线程程序的代码复审370
10.2.4多线程程序的单元测试:JCStress372
10.3本章小结375
第二部分多线程编程进阶
第11章多线程编程的硬件基础与Java内存模型378
11.1填补处理器与内存之间的鸿沟:高速缓存378
11.2数据世界的交通规则:缓存一致性协议382
11.3硬件缓冲区:写缓冲器与无效化队列386
11.3.1存储转发388
11.3.2再探内存重排序388
11.3.3再探可见性391
11.4基本内存屏障392
11.5Java同步机制与内存屏障395
11.5.1volatile关键字的实现395
11.5.2synchronized关键字的实现397
11.5.3Java虚拟机对内存屏障使用的优化398
11.5.4final关键字的实现398
11.6Java内存模型399
11.6.1什么是Java内存模型400
11.6.2happens-before关系401
11.6.3再探对象的安全发布407
11.6.4JSR 133411
11.7共享变量与性能411
11.8本章小结411
第12章Java多线程程序的性能调校415
12.1Java虚拟机对内部锁的优化415
12.1.1锁消除415
12.1.2锁粗化417
12.1.3偏向锁419
12.1.4适应性锁420
12.2优化对锁的使用421
12.2.1锁的开销与锁争用监视421
12.2.2使用可参数化锁424
12.2.3减小临界区的长度428
12.2.4减小锁的粒度432
12.2.5考虑锁的替代品438
12.3减少系统内耗:上下文切换438
12.4多线程编程的三十六计:多线程设计模式440
12.5性能的隐形杀手:伪共享441
12.5.1Java对象内存布局442
12.5.2伪共享的侦测与消除445
12.6本章小结454
Web参考资源457
参考文献463
|
內容試閱:
|
前言
随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了如今就连智能手机这样的消费类设备都已配备了4核乃至8核的处理器,更何况商用系统!在此背景下,以往靠单个处理器自身处理能力的提升所带来的软件计算性能提升的那种免费午餐已不复存在,这使得多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。故而,掌握多线程编程技能对广大开发人员的重要性亦由此可见一斑。
本书内容及特色
本书以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及相关工具。
脉络清晰、循序渐进和系统性介绍。全书围绕多线程编程所要解决的问题(所要实现的目标)及其面临的各种挑战,由此展开介绍多线程编程中的相关概念、原理与技术。本书以先介绍相关问题及背景再给出相应的解决方案的方式来讲解新的概念、知识。并且,本书对概念、原理与技术的讲解会适当地深入到Java虚拟机、操作系统和硬件这三个层次与角度,而不仅仅停留在Java语言层面。全书章节是按照知识间的内在联系并依照认知程度上的由浅至深的顺序组织的。
以基本概念、原理与方法为主线。本书既注重实战又注重理论对实践的指导作用。本书以多线程编程的基本概念、原理与方法为主线,将Java平台中与多线程编程相关的关键字、Java标准库类(API)等知识串在其上进行讲解,并在讲解过程中适当穿插相关工具的介绍。本书在介绍相关Java标准库类时,不仅仅介绍其API,还适当介绍其内部实现原理与实战注意事项。
辅以丰富的实战案例和生活化实例。本书配有丰富的实战案例,这些案例的配套源码都是可以实际运行的,以便读者进行实验。本书在介绍一些概念和原理的时候往往辅以一些生活化实例以增加读者的感性认识,降低理解难度。
答疑解惑。本书讲解过程中会穿插一些扩展阅读的内容,这部分内容以问答的形式来对多线程编程的初学者在学习和工作过程中经常遇到的一些疑惑和问题进行解答。
本书一共分为12章,各章的主要内容如下。
第1章主要介绍线程及多线程编程这两个基本概念,以及Java平台的线程API,并通过一个实战案例使读者对多线程编程有个初步和感性的认识。
第2章主要介绍多线程编程所要实现的目标及其面临的挑战。明确多线程编程的目标有助于我们在实践中做到有的放矢,掌握多线程编程所面临的挑战使得我们在学习本书后续内容时能够做到知其然而且知其所以然。
第3章主要介绍Java平台所提供的能够用于应对多线程编程所面临的部分挑战的一些关键字和标准库类(API),以及这些关键字和API的性能开销、适用场景及注意事项。
第4章通过实战案例介绍具体如何玩转线程以实现多线程编程的目标,并通过这些实战案例展开介绍多线程编程实践中的一些实际问题及应对措施。
第5章主要介绍线程与线程之间通过哪些常见的协作形式来实现多线程编程的目标以及Java所支持的相应标准库类。
第6章主要从软件设计的角度出发介绍应对多线程编程所面临的一些挑战的常见技术。
第7章主要介绍多线程程序可能产生的一些常见的具有隐蔽性的故障以及相应的规避措施。
第8章主要介绍在多线程编程中如何更加有效和有效率地使用线程。
第9章主要从计算模型的角度出发介绍多线程编程中如何利用线程来提高软件的吞吐率和响应性。
第10章主要介绍Java平台中多线程程序的调试技巧与测试手段。
第11章主要介绍多线程编程的硬件基础以及Java平台为屏蔽不同硬件平台的差异而进行的抽象(Java内存模型)。
第12章结合实战案例介绍与Java平台中的多线程程序紧密相关的常用性能优化方法与技术。
目标读者
本书适合有一定Java语言基础的读者作为入门多线程编程之用,也适合有一定多线程编程经验的读者作为重新梳理知识结构以提升认知层次和参考之用。
本书约定
1.对于标题中带星号(*)的小节,读者可以选择先浏览一下章节标题就跳过它,之后在阅读后续内容遇到问题时再回头来阅读相应的小节。
2.斜体格式的方法名表示相应方法为静态方法,例如System.currentTimeMillis(其中,方法名currentTimeMillis的字体格式为斜体)。非斜体格式的方法名表示相应方法为相应类的实例方法,例如StringBuilder.appendString或者StringBuilder.appendString str均表示类StringBuilder的实例方法append。本书有时候也会省略方法中的形式参数列表。
3.本书用作为分隔符来表示同一个类的多个方法。例如,StringBuilder.append StringtoString表示StringBuilder的append方法和toString方法。
4.本书所指的Java虚拟机(JVM)如无特别说明均特指Oracle公司的HotSpot Java虚拟机。
5.就HotSpot Java虚拟机而言,JIT(Just In Time)编译器是该Java虚拟机的一部分,因此本书有时候并不严格区分Java虚拟机和JIT编译器。
6.本书涉及的命令如无特别说明均指Linux平台下的命令。
如何阅读本书
本书讲解过程中会涉及一些与多线程编程紧密相关的硬件知识,如果读者对这些知识不太熟悉,可以在阅读过程中参考或者直接先行阅读本书第11章前4节的内容。
读者也可以先阅读完本书前4章的内容,接着就开始集中实践。然后边实践边阅读本书的后续章节,或者在实践过程中遇到问题时再参考本书后续章节的内容。当然,这种阅读方法主要是便于读者尽快上手,并不是说本书后续章节的内容无足轻重。
学习一门新的技术、语言的一个行之有效的方法就是边学习边思考、带着问题在学习过程中寻找答案。因此,本书讲解过程中会穿插一些扩展阅读的内容,这些内容多涉及新手在学习多线程编程过程中经常会遇到的一些疑惑和问题。尽管如此,这并不能代替读者自己主动思考并从书中或者其他途径寻找答案。
本书介绍了Java标准库中与多线程编程紧密相关的一些类,但是这些内容并不能取代读者亲自阅读Java的API文档(http:docs.oracle.comjavase8docsapi)。
配套源码下载
本书配套源码可以从下列网址下载:
https:github.comViscentjavamtia
或者,
http:www.broadview.com.cn31065
与作者联系
读者在阅读本书过程中遇到问题或者有任何建议时,可以通过微信公众号VChannel与作者联系。
读者服务
轻松注册成为博文视点社区用户(www.broadview.com.cn),您即可享受以下服务。
下载资源:本书所提供的示例代码及资源文件均可在【下载资源】处下载。
?提交勘误:您对书中内容的修改意见可在【提交勘误】处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。
?与作者交流:在页面下方【读者评论】处留下您的疑问或观点,与作者和其他读者一同学习交流。
页面入口:http:www.broadview.com.cn31065
|
|