前言
这本书涵盖了什么
这本书你需要什么
这本书是给谁的
约定
读者反馈
客户支持
下载示例代码
勘误
盗版
问题
基本并发概念
并发与并行
同步化
不变的对象
原子运算和变量
共享内存与消息传递
并发应用程序中可能出现的问题
数据竞争
僵局
活锁
资源匮乏
优先级倒置
设计并发算法的方法
起点-算法的连续版本
步骤1-分析
步骤2-设计
步骤3-实施
步骤4-测试
步骤5-调整
结论
Java并发API
基本并发类
同步机制
执行者
fork/join框架
并行流
并发数据结构
并发设计模式
发信号
会合
互斥体
多重
屏障
双重检查锁定
读写锁
线程池
线程本地存储
设计并发算法的提示和技巧
确定正确的独立任务
在尽可能高的级别上实现并发
考虑可扩展性
使用线程安全的API
永远不要执行命令
尽可能优先使用本地线程变量而不是静态变量和共享变量
寻找更容易的可并行化算法版本
尽可能使用不可变的对象
通过订购锁避免死锁
使用原子变量而不是同步
保持锁的时间尽可能短
使用延迟初始化采取预防措施
避免在关键部分使用阻塞操作
摘要
Java中的线程
Java线程-特征和状态
Thread类和Runnable接口
第一个例子:矩阵乘法
普通班
序列号版本
平行版本
第一个并发版本-每个元素一个线程
第二个并发版本-每行一个线程
第三个并发版本-线程数由处理器确定
比较解决方案
第二个例子-文件搜索
普通班
序列号版本
并发版本
比较解决方案
摘要
执行者简介
执行者的基本特征
执行器框架的基本组件
第一个示例-k最近邻算法
k最近邻居-串行版本
K近邻-细粒度并发版本
k最近邻居-粗粒度并发版本
比较解决方案
第二个示例-客户端/服务器环境中的并发
客户端/服务器-串行版本
DAO部分
命令部分
服务器部分
客户端/版本-并行版本
服务器部分
命令部分
并发服务器的额外组件
状态命令
缓存系统
日志系统
比较两种解决方案
其他感兴趣的方法
摘要
执行者的先进特征
取消任务
安排任务执行
覆盖执行程序方法
更改一些初始化参数
第一个示例-高级服务器应用程序
ServerExecutor类
统计对象
被拒绝的任务控制器
执行者任务
执行者
命令类
ConcurrentCommand类
具体命令
服务器部分
ConcurrentServer类
RequestTask类
客户端部分
第二个示例-执行定期任务
共同部分
基本读者
高级阅读器
有关执行者的其他信息
摘要
引入Callable和Future接口
通话界面
Future界面
第一个示例-单词的最佳匹配算法
普通班
最佳匹配算法-串行版本
BestMatchingSerialCalculation类
BestMachingSerialMain类
最佳匹配算法-第一个并发版本
BestMatchingBasicTask类
BestMatchingBasicConcurrentCalculation类
最佳匹配算法-第二个并发版本
Word存在算法-串行版本
ExistSerialCalculation类
ExistSerialMain类
Word存在算法-并发版本
ExistBasicTasks类
ExistBasicConcurrentCalculation类
ExistBasicConcurrentMain类
比较解决方案
最佳匹配算法
现有算法
第二个示例-为文档集合创建反向索引
普通班
文档类
DocumentParser类
串行版本
第一个并发版本-每个文档的任务
IndexingTask类
InvertedIndexTask类
ConcurrentIndexing类
第二个并发版本-每个任务有多个文档
MultipleIndexingTask类
MultipleInvertedIndexTask类
MultipleConcurrentIndexing类
比较解决方案
其他感兴趣的方法
摘要
移相器类简介
参与者注册和注销
同步相变
其他功能
第一个示例-关键字提取算法
普通班
单词课
关键字类别
文档类
DocumentParser类
串行版本
并发版本
KeywordExtractionTask类
ConcurrentKeywordExtraction类
比较两种解决方案
第二个例子-遗传算法
普通班
个人班
GeneticOperators类
串行版本
SerialGeneticAlgorithm类
SerialMain类
并发版本
SharedData类
GeneticPhaser类
ConcurrentGeneticTask类
ConcurrentGeneticAlgorithm类
ConcurrentMain类
比较两种解决方案
Lau15数据集
KN57数据集
结论
摘要
fork / join框架简介
fork / join框架的基本特征
fork / join框架的局限性
fork / join框架的组件
第一个示例-k-均值聚类算法
普通班
VocabularyLoader类
word,document和DocumentLoader类
DistanceMeasurer类
DocumentCluster类
串行版本
SerialKMeans类
SerialMain类
并发版本
fork / join框架的两个任务-AssignmentTask和UpdateTask
ConcurrentKMeans类
ConcurrentMain类
比较解决方案
第二个示例-数据过滤算法
共同特征
串行版本
SerialSearch类
SerialMain类
并发版本
TaskManager类
IndividualTask类
ListTask类
ConcurrentSearch类
ConcurrentMain类
比较两个版本
第三个示例-合并排序算法
共享课程
串行版本
SerialMergeSort类
SerialMetaData类
并发版本
MergeSortTask类
ConcurrentMergeSort类
ConcurrentMetaData类
比较两个版本
fork / join框架的其他方法
摘要
流介绍
流的基本特征
流的各个部分
流的来源
中级作业
终端操作
MapReduce和MapCollect
第一个示例-数值汇总应用程序
并发版本
ConcurrentDataLoader类
ConcurrentStatistics类
来自英国的客户
来自英国的数量
产品所在国家
产品数量
多数据过滤
最高发票金额
单价在1到10之间的产品
ConcurrentMain类
串行版本
比较两个版本
第二个示例-信息检索搜索工具
归约运算简介
第一种方法-完整文档查询
basicMapper()方法
令牌类
QueryResult类
第二种方法-减少文档查询
limitedMapper()方法
第三种方法-生成带有结果的HTML文件
ContentMapper类
第四种方法-预加载倒排索引
ConcurrentFileLoader类
第五种方法-使用我们自己的执行器
从倒排索引中获取数据-ConcurrentData类
获取文件中的单词数
获取文件中的平均tfxidf值
获取索引中的最大和最小tfxidf值
ConcurrentMain类
串行版本
比较解决方案
摘要
使用流收集数据
collect()方法
第一个示例-搜索没有索引的数据
基础班
产品类别
评论班
ProductLoader类
第一种方法-基本搜索
ConcurrentStringAccumulator类
第二种方法-高级搜索
ConcurrentObjectAccumulator类
示例的串行实现
比较实施
第二个例子-推荐系统
普通班
ProductReview类
产品推荐类
推荐系统-主类
ConcurrentLoaderAccumulator类
串行版本
比较两个版本
第三个示例-社交网络中的常用联系人
base classes
人员类
人员配对类
DataLoader类
并发版本
CommonPersonMapper类
ConcurrentSocialNetwork类
ConcurrentMain类
串行版本
比较两个版本
摘要
Java反应流简介
Flow.Publisher界面
Flow.Subscriber接口
Flow.Subscription接口
SubmissionPublisher类
第一个示例-用于事件通知的集中式系统
活动类
生产者类
消费阶层
主班
第二个例子-新闻系统
新闻课
发布者类
消费阶层
主班
摘要
并发数据结构
阻塞和非阻塞数据结构
并发数据结构
介面
阻塞队列
阻塞双端队列
并发图
传输队列
班级
LinkedBlockingQueue
ConcurrentLinkedQueue
LinkedBlockingDeque
并发链接双端队列
ArrayBlockingQueue
延迟队列
LinkedTransferQueue
PriorityBlockingQueue
并发哈希图
使用新功能
第一个使用ConcurrentHashMap的示例
forEach()方法
search()方法
reduce()方法
compute()方法
ConcurrentHashMap的另一个示例
ConcurrentLinkedDeque类的示例
removeIf()方法
spliterator()方法
原子变量
可变手柄
同步机制
CommonTask类
锁界面
信号量类
CountDownLatch类
CyclicBarrier类
CompletableFuture类
使用CompletableFuture类
辅助任务
main()方法
摘要
监控并发对象
监控线程
监控锁
监视执行者
监视fork / join框架
监控移相器
监控流API
监视并发应用程序
概述选项卡
内存选项卡
线程选项卡
类别标签
VM摘要选项卡
MBeans选项卡
关于标签
测试并发应用
使用MultithreadedTC测试并发应用程序
使用Java Pathfinder测试并发应用程序
安装Java Pathfinder
运行Java Pathfinder
摘要
Clojure中的并发
使用Java元素
参考类型
原子
代理商
参考
延误
期货
承诺
GPars库在Groovy中进行并发
软件事务存储
使用Java元素
数据并行
分叉/连接处理
演员们
代理商
数据流
Scala中的并发
Scala中的未来对象
承诺
摘要
如今,计算机系统(以及其他相关系统,例如平板电脑或智能手机)使您可以同时执行多个任务。 这是可能的,因为它们具有同时控制多个任务的并发操作系统。 如果您使用自己喜欢的编程语言的并发API,那么您还可以使一个应用程序执行多个任务(读取文件,显示消息并通过网络读取数据)。 Java包含一个非常强大的并发API,使您可以轻松实现任何种类的并发应用程序。 该API增加了每个版本中提供给程序员的功能-现在,在Java 8中,它包括Stream API和新方法和类,以促进并发应用程序的实现。 本书涵盖了Java并发API的最重要元素,向您展示了如何在实际应用程序中使用它们。
这些元素如下:
Executor框架,用于控制许多任务的执行
Phaser类,用于执行可以分为多个阶段的任务
fork / join框架,用于执行使用分而治之技术解决问题的任务
Stream API,用于处理大型数据源,包括新的响应流
并发数据结构,用于将数据存储在并发应用程序中
同步机制,组织并发任务
但是,Java并发API包含更多内容-一种用于设计并发应用程序的方法,设计模式,实现良好并发应用程序的技巧和窍门,用于测试并发应用程序的工具和技术,以及用于以其他语言实现并发应用程序的方法。 Java虚拟机,例如Clojure,Groovy和Scala。
第1章,第一步-并发设计原则,介绍了并发应用程序的设计原则。您还将学习并发应用程序可能存在的问题以及设计它们的方法,以及一些设计模式,技巧和窍门。
第2章,使用基本元素-线程和Runnable,介绍了如何使用最基本的元素以Java语言实现并发应用程序:Runnable接口和Thread类。使用这些元素,您可以创建一个新的执行线程,该线程将与实际线程并行执行。
第3章,管理大量线程-执行程序,涵盖了执行程序框架的基本原理。该框架允许您使用大量线程,而无需创建或管理它们。我们将实现k最近邻居算法和基本的客户端/服务器应用程序。
第4章,充分利用执行程序,探讨了执行程序的一些高级特性,包括取消和安排任务以在延迟或每隔一定时间后执行任务。我们将实现高级的客户端/服务器应用程序和新闻阅读器。
第5章,从任务中获取数据-Callable and Future接口,说明了如何在执行程序中使用通过Callable and Future接口返回结果的任务。我们将实现最佳匹配算法和一个构建反向索引的应用程序。
第6章,划分为阶段的运行任务-Phaser类,介绍了如何使用Phaser类以并行方式执行可以划分为多个阶段的任务。我们将实现关键字提取算法和遗传算法。
第7章,优化分治方案-Fork / Join框架探讨了一种特殊的Executor的用法,该方法通过使用分治技术可以解决的那些问题进行了优化:fork / join框架及其窃取工作算法。我们将实现k-means聚类算法,数据过滤算法和合并排序算法。
第8章,使用并行流处理大量数据集-Map and Reduce模型,介绍了如何使用流来处理大型数据集。在本章中,您将学习如何使用Stream API来实现地图和简化应用程序,并且还将学习更多的流功能。我们将实现数值汇总算法和信息检索搜索工具。
第9章,使用并行流处理海量数据集-Map and Collect模型,探讨了如何使用Stream API的collect方法将数据流可变地还原为不同的数据结构,包括在Java中定义的预定义收集器。收藏家课。我们将实现无需索引即可搜索数据的工具,推荐系统以及计算社交网络上两个人的公共联系人列表的算法。
第10章“异步流处理–反应性流”介绍了如何使用反应性流实现并发应用程序,该应用程序定义了无阻塞背压的异步流处理标准。这种流的基本原理在http://www.reactive-streams.org/上定义,并且Java 9提供了实现其所需的基本接口。
第11章,并发数据结构和同步实用程序,介绍如何使用最重要的并发数据结构(可在并发应用程序中使用而不会引起数据争用条件的数据结构)以及Java并发API中包含的所有同步机制。组织任务的执行。
第12章,测试和监视并发应用程序,说明如何获取有关某些Java并发API元素(线程,锁,执行器等)状态的信息。您还将学习如何使用Java VisualVM应用程序监视并发应用程序,以及如何使用MultithreadedTC库和Java Pathfinder应用程序测试并发应用程序。
第13章,JVM中的并发–使用Gpars库和Scala的Clojure和Groovy,探讨了如何以其他语言为Java虚拟机实现并发应用程序。您将学习如何使用Clojure和Scala编程语言以及GPars库和Groovy编程语言提供的并发元素。