Java特性非凡,有套十分强劲的高并发API,在其中包括很多随时随地能用又极为灵便的原素,可用以轻轻松松保持一切种类的高并发手机应用程序。 这书从高并发解决的角度讨论Java程序编写。最先详解了高并发手机应用程序的结构设计,论述了怎样对串行优化算法开展并行处理化解决。随后详细介绍了Thread类和Runnable插口,他们是Java高并发API的关键构成。然后探讨了怎样运用Java高并发API的各种各样原素,及其怎样在强劲的真實高并发手机应用程序中保持他们。*后详解了检测高并发Java手机应用程序的专用工具和方法,概述详细介绍了JVM中的别的高并发体制。 - 把握高并发手机应用程序务必遵照的标准 - 并行处理化串行优化算法以提高特性,一起不容易造成统计数据不相同和死锁 - 灵活运用Java高并发API的全部原素 - 运用电动执行机构将进程管理方法与手机应用程序的别的一部分防护开开 - 应用Phaser类高并发实行可分成好几个环节的每日任务 - 根据Fork/Join架构,运用并行处理版分治设计方案统一范式解决困难 - 应用并行处理流和反映流 - 保持MapReduce和MapCollect实体模型 - 操纵Java高并发API出示的高并发数据结构和同歩体制 - 为大数据挖掘、深度学习等实际上难题保持高效率解决方法
Java 出示了一整套十分强劲的高并发API,能够轻轻松松保持一切种类的高并发手机应用程序。这书叙述Java 高并发API *关键的原素,包含电动执行机构架构、Phaser 类、Fork/Join 架构、流API、高并发数据结构、同歩体制,并展现怎样在实际上开发设计中应用他们。除此之外,这书还详细介绍了设计方案高并发手机应用程序的策略来支撑环境变化在校园营销推广环节中所带来的新问题、设计模式、保持优良高并发手机应用程序的提醒和方法、检测高并发手机应用程序的专用工具和方式,及其怎么使用朝向Java 虚拟机的别的计算机语言保持高并发手机应用程序。
目录
- 第 1 章 第 一步:并发设计原理 1
- 1.1 基本的并发概念 1
- 1.1.1 并发与并行 1
- 1.1.2 同步 2
- 1.1.3 不可变对象 2
- 1.1.4 原子操作和原子变量 3
- 1.1.5 共享内存与消息传递 3
- 1.2 并发应用程序中可能出现的问题 3
- 1.2.1 数据竞争 3
- 1.2.2 死锁 4
- 1.2.3 活锁 4
- 1.2.4 资源不足 4
- 1.2.5 优先权反转 5
- 1.3 设计并发算法的方法论 5
- 1.3.1 起点:算法的一个串行版本 5
- 1.3.2 第 1 步:分析 5
- 1.3.3 第 2 步:设计 5
- 1.3.4 第3 步:实现 6
- 1.3.5 第4 步:测试 6
- 1.3.6 第5 步:调整 6
- 1.3.7 结论 7
- 1.4 Java 并发API 8
- 1.4.1 基本并发类 8
- 1.4.2 同步机制 8
- 1.4.3 执行器 9
- 1.4.4 Fork/Join 框架 9
- 1.4.5 并行流 9
- 1.4.6 并发数据结构 9
- 1.5 并发设计模式 10
- 1.5.1 信号模式 10
- 1.5.2 会合模式 11
- 1.5.3 互斥模式 11
- 1.5.4 多元复用模式 12
- 1.5.5 栅栏模式 12
- 1.5.6 双重检查锁定模式 12
- 1.5.7 读 写锁模式 13
- 1.5.8 线程池模式 14
- 1.5.9 线程局部存储模式 14
- 1.6 设计并发算法的提示和技巧 14
- 1.6.1 正确识别独立任务 14
- 1.6.2 在尽可能高的层面上实施并发处理 15
- 1.6.3 考虑伸缩性 15
- 1.6.4 使用线程安全API 15
- 1.6.5 绝不要假定执行顺序 16
- 1.6.6 在静态和共享场合尽可能使用局部线程变量 16
- 1.6.7 寻找更易于并行处理的算法版本 17
- 1.6.8 尽可能使用不可变对象 17
- 1.6.9 通过对锁排序来避免死锁 17
- 1.6.10 使用原子变量代替同步 18
- 1.6.11 占有锁的时间尽可能短 19
- 1.6.12 谨慎使用延迟初始化 19
- 1.6.13 避免在临界段中使用阻塞操作 19
- 1.7 小结 20
- 第 2 章 使用基本元素:Thread 和Runnable 21
- 2.1 Java 中的线程 21
- 2.1.1 Java 中的线程:特征和状态 22
- 2.1.2 Thread 类和Runnable 接口 23
- 2.2 第 一个例子:矩阵乘法 24
- 2.2.1 公共类 24
- 2.2.2 串行版本 25
- 2.2.3 并行版本 25
- 2.3 第二个例子:文件搜索 32
- 2.3.1 公共类 32
- 2.3.2 串行版本 32
- 2.3.3 并发版本 33
- 2.3.4 对比解决方案 37
- 2.4 小结 38
- 第3 章 管理大量线程:执行器 39
- 3.1 执行器简介 39
- 3.1.1 执行器的基本特征 39
- 3.1.2 执行器框架的基本组件 40
- 3.2 第 一个例子:k-最近邻算法 40
- 3.2.1 k-最近邻算法:串行版本 41
- 3.2.2 k-最近邻算法:细粒度并发版本 42
- 3.2.3 k-最近邻算法:粗粒度并发版本 45
- 3.2.4 对比解决方案 46
- 3.3 第二个例子:客户端/服务器环境下的并发处理 48
- 3.3.1 客户端/服务器:串行版 48
- 3.3.2 客户端/服务器:并行版本 51
- 3.3.3 额外的并发服务器组件 54
- 3.3.4 对比两种解决方案 59
- 3.3.5 其他重要方法 61
- 3.4 小结 62
- 第4 章 充分利用执行器 63
- 4.1 执行器的高级特性 63
- 4.1.1 任务的撤销 63
- 4.1.2 任务执行调度 64
- 4.1.3 重载执行器方法 64
- 4.1.4 更改一些初始化参数 64
- 4.2 第 一个例子:高级服务器应用程序 65
- 4.2.1 ServerExecutor 类 65
- 4.2.2 命令类 70
- 4.2.3 服务器部件 72
- 4.2.4 客户端部件 78
- 4.3 第二个例子:执行周期性任务 79
- 4.3.1 公共部件 79
- 4.3.2 基础阅读器 81
- 4.3.3 高级阅读器 84
- 4.4 有关执行器的其他信息 87
- 4.5 小结 87
- 第5 章 从任务获取数据:Callable接口与Future 接口 88
- 5.1 Callable 接口和Future 接口简介 88
- 5.1.1 Callable 接口 88
- 5.1.2 Future 接口 89
- 5.2 第 一个例子:单词最佳匹配算法 89
- 5.2.1 公共类 90
- 5.2.2 最佳匹配算法:串行版本 91
- 5.2.3 最佳匹配算法:第 一个并发版本 92
- 5.2.4 最佳匹配算法:第二个并发版本 95
- 5.2.5 单词存在算法:串行版本 96
- 5.2.6 单词存在算法:并行版本 98
- 5.2.7 对比解决方案 100
- 5.3 第二个例子:为文档集创建倒排索引 102
- 5.3.1 公共类 103
- 5.3.2 串行版本 104
- 5.3.3 第 一个并发版本:每个文档一个任务 105
- 5.3.4 第二个并发版本:每个任务多个文档 109
- 5.3.5 对比解决方案 112
- 5.3.6 其他相关方法 113
- 5.4 小结 113
- 第6 章 运行分为多阶段的任务:Phaser 类 115
- 6.1 Phaser 类简介 115
- 6.1.1 参与者的注册与注销 116
- 6.1.2 同步阶段变更 116
- 6.1.3 其他功能 116
- 6.2 第 一个例子:关键字抽取算法 117
- 6.2.1 公共类 118
- 6.2.2 串行版本 121
- 6.2.3 并发版本 123
- 6.2.4 对比两种解决方案 128
- 6.3 第二个例子:遗传算法 129
- 6.3.1 公共类 130
- 6.3.2 串行版本 132
- 6.3.3 并发版本 134
- 6.3.4 对比两种解决方案 139
- 6.4 小结 141
- 第7 章 优化分治解决方案:
- Fork/Join 框架 142
- 7.1 Fork/Join 框架简介 142
- 7.1.1 Fork/Join 框架的基本特征 143
- 7.1.2 Fork/Join 框架的局限性 143
- 7.1.3 Fork/Join 框架的组件 144
- 7.2 第 一个例子:k-means 聚类算法 144
- 7.2.1 公共类 145
- 7.2.2 串行版本 149
- 7.2.3 并发版本 151
- 7.2.4 对比解决方案 155
- 7.3 第二个例子:数据筛选算法 157
- 7.3.1 公共特性 157
- 7.3.2 串行版 157
- 7.3.3 并发版本 159
- 7.3.4 对比两个版本 165
- 7.4 第三个例子:归并排序算法 166
- 7.4.1 共享类 166
- 7.4.2 串行版本 167
- 7.4.3 并发版本 169
- 7.4.4 对比两个版本 172
- 7.5 Fork/Join 框架的其他方法 172
- 7.6 小结 173
- 第8 章 使用并行流处理大规模数据集:MapReduce 模型 174
- 8.1 流的简介 174
- 8.1.1 流的基本特征 174
- 8.1.2 流的组成部分 175
- 8.1.3 MapReduce 与MapCollect 177
- 8.2 第 一个例子:数值综合分析应用程序 178
- 8.2.1 并发版本 178
- 8.2.2 串行版本 185
- 8.2.3 对比两个版本 186
- 8.3 第二个例子:信息检索工具 186
- 8.3.1 约简操作简介 187
- 8.3.2 第 一种方式:全文档查询 188
- 8.3.3 第二种方式:约简的文档查询 191
- 8.3.4 第三种方式:生成一个含有结果的HTML 文件 191
- 8.3.5 第四种方式:预先载入倒排索引 194
- 8.3.6 第五种方式:使用我们的执行器 195
- 8.3.7 从倒排索引获取数据:ConcurrentData 类 196
- 8.3.8 获取文件中的单词数 196
- 8.3.9 获取文件的平均tfxidf 值 196
- 8.3.10 获取索引中的最大tfxidf值和最小tfxidf 值 197
- 8.3.11 ConcurrentMain 类 198
- 8.3.12 串行版 199
- 8.3.13 对比两种解决方案 199
- 8.4 小结 202
- 第9 章 使用并行流处理大规模数据集:MapCollect 模型 203
- 9.1 使用流收集数据 203
- 9.2 第 一个例子:无索引条件下的数据搜索 205
- 9.2.1 基本类 205
- 9.2.2 第 一种方式:基本搜索 207
- 9.2.3 第二种方式:高级搜索 209
- 9.2.4 本例的串行实现 211
- 9.2.5 对比实现方案 211
- 9.3 第二个例子:推荐系统 212
- 9.3.1 公共类 212
- 9.3.2 推荐系统:主类 213
- 9.3.3 ConcurrentLoaderAccumulator 类 215
- 9.3.4 串行版 216
- 9.3.5 对比两个版本 216
- 9.4 第三个例子:社交网络中的共同联系人 217
- 9.4.1 基本类 218
- 9.4.2 并发版本 219
- 9.4.3 串行版本 223
- 9.4.4 对比两个版本 223
- 9.5 小结 224
- 第 10 章 异步流处理:反应流 225
- 10.1 Java 反应流简介 225
- 10.1.1 Flow.Publisher 接口 226
- 10.1.2 Flow.Subscriber 接口 226
- 10.1.3 Flow.Subscription 接口 226
- 10.1.4 SubmissionPublisher 类 226
- 10.2 第 一个例子:面向事件通知的集中式系统 227
- 10.2.1 Event 类 227
- 10.2.2 Producer 类 227
- 10.2.3 Consumer 类 228
- 10.2.4 Main 类 230
- 10.3 第二个例子:新闻系统 231
- 10.3.1 News 类 232
- 10.3.2 发布者相关的类 232
- 10.3.3 Consumer 类 235
- 10.3.4 Main 类 236
- 10.4 小结 238
- 第 11 章 探究并发数据结构和同步工具 240
- 11.1 并发数据结构 240
- 11.1.1 阻塞型数据结构和非阻塞型数据结构 241
- 11.1.2 并发数据结构 241
- 11.1.3 使用新特性 244
- 11.1.4 原子变量 251
- 11.1.5 变量句柄 252
- 11.2 同步机制 254
- 11.2.1 CommonTask 类 255
- 11.2.2 Lock 接口 255
- 11.2.3 Semaphore 类 256
- 11.2.4 CountDownLatch 类 258
- 11.2.5 CyclicBarrier 类 259
- 11.2.6 CompletableFuture 类 261
- 11.3 小结 268
- 第 12 章 测试与监视并发应用程序 269
- 12.1 监视并发对象 269
- 12.1.1 监视线程 269
- 12.1.2 监视锁 270
- 12.1.3 监视执行器 272
- 12.1.4 监视Fork/Join 框架 273
- 12.1.5 监视Phaser 274
- 12.1.6 监视流API 275
- 12.2 监视并发应用程序 276
- 12.2.1 Overview 选项卡 278
- 12.2.2 Memory 选项卡 279
- 12.2.3 Threads 选项卡 280
- 12.2.4 Classes 选项卡 280
- 12.2.5 VM Summary 选项卡 281
- 12.2.6 MBeans 选项卡 283
- 12.2.7 About 选项卡 284
- 12.3 测试并发应用程序 284
- 12.3.1 使用MultithreadedTC 测试并发应用程序 285
- 12.3.2 使用Java Pathfinder 测试并发应用程序 288
- 12.4 小结 293
- 第 13 章 JVM 中的并发处理:Clojure、带有GPars 库的Groovy 以及Scala 294
- 13.1 Clojure 的并发处理 294
- 13.1.1 使用Java 元素 295
- 13.1.2 引用类型 295
- 13.1.3 Ref 对象 298
- 13.1.4 Delay 299
- 13.1.5 Future 300
- 13.1.6 Promise 301
- 13.2 Groovy 及其GPars 库的并发处理 302
- 13.3 软件事务性内存 302
- 13.3.1 使用Java 元素 302
- 13.3.2 数据并行处理 303
- 13.3.3 Fork/Join 处理 307
- 13.3.4 Actor 308
- 13.3.5 Agent 315
- 13.3.6 Dataf low 316
- 13.4 Scala 的并发处理 322
- 13.4.1 Scala 中的Future 对象 322
- 13.4.2 Promise 328
- 13.5 小结 329