Java 并发编程

目录

前言
这本书涵盖了什么
这本书你需要什么
这本书是给谁的
约定
读者反馈
客户支持
下载示例代码
勘误
盗版

问题

1,第一步-并发设计原则 

基本并发概念
    并发与并行
    同步化
    不变的对象
    原子运算和变量
    共享内存与消息传递
    并发应用程序中可能出现的问题
    数据竞争
    僵局
    活锁
    资源匮乏
    优先级倒置
设计并发算法的方法
    起点-算法的连续版本
    步骤1-分析
    步骤2-设计
    步骤3-实施
    步骤4-测试
    步骤5-调整
    结论
Java并发API
    基本并发类
    同步机制
    执行者
    fork/join框架
    并行流
    并发数据结构
并发设计模式
    发信号
    会合
    互斥体
    多重
    屏障
    双重检查锁定
    读写锁
    线程池
    线程本地存储
设计并发算法的提示和技巧
    确定正确的独立任务
    在尽可能高的级别上实现并发
    考虑可扩展性
    使用线程安全的API
    永远不要执行命令
    尽可能优先使用本地线程变量而不是静态变量和共享变量
    寻找更容易的可并行化算法版本
    尽可能使用不可变的对象
    通过订购锁避免死锁
    使用原子变量而不是同步
    保持锁的时间尽可能短
    使用延迟初始化采取预防措施
    避免在关键部分使用阻塞操作
摘要

2.使用基本元素-线程和可运行对象

    Java中的线程
        Java线程-特征和状态
        Thread类和Runnable接口
    第一个例子:矩阵乘法    
        普通班
        序列号版本
        平行版本
            第一个并发版本-每个元素一个线程
            第二个并发版本-每行一个线程
            第三个并发版本-线程数由处理器确定
        比较解决方案
    第二个例子-文件搜索
        普通班
    序列号版本
    并发版本
    比较解决方案
    摘要

3.管理大量线程-执行程序

    执行者简介
        执行者的基本特征
        执行器框架的基本组件
    第一个示例-k最近邻算法
        k最近邻居-串行版本
        K近邻-细粒度并发版本
        k最近邻居-粗粒度并发版本
        比较解决方案
    第二个示例-客户端/服务器环境中的并发
        客户端/服务器-串行版本
            DAO部分
            命令部分
            服务器部分
        客户端/版本-并行版本
            服务器部分
            命令部分
        并发服务器的额外组件
            状态命令
            缓存系统
            日志系统
            比较两种解决方案
        其他感兴趣的方法
    摘要

4.充分利用执行者

    执行者的先进特征
        取消任务
        安排任务执行
        覆盖执行程序方法
        更改一些初始化参数
    第一个示例-高级服务器应用程序
        ServerExecutor类
        统计对象
        被拒绝的任务控制器
        执行者任务
        执行者
    命令类
        ConcurrentCommand类
        具体命令
    服务器部分
        ConcurrentServer类
        RequestTask类
    客户端部分
    第二个示例-执行定期任务
        共同部分
        基本读者
        高级阅读器
    有关执行者的其他信息
    摘要

5.从任务获取数据-可调用和将来的接口

    引入Callable和Future接口
        通话界面
        Future界面
    第一个示例-单词的最佳匹配算法
        普通班
    最佳匹配算法-串行版本
        BestMatchingSerialCalculation类
        BestMachingSerialMain类
    最佳匹配算法-第一个并发版本
        BestMatchingBasicTask类
        BestMatchingBasicConcurrentCalculation类
    最佳匹配算法-第二个并发版本
    Word存在算法-串行版本
        ExistSerialCalculation类
        ExistSerialMain类
    Word存在算法-并发版本
        ExistBasicTasks类
        ExistBasicConcurrentCalculation类
        ExistBasicConcurrentMain类
    比较解决方案
        最佳匹配算法
        现有算法
    第二个示例-为文档集合创建反向索引
        普通班
            文档类
            DocumentParser类
        串行版本
        第一个并发版本-每个文档的任务
            IndexingTask类
            InvertedIndexTask类
            ConcurrentIndexing类
        第二个并发版本-每个任务有多个文档
            MultipleIndexingTask类
            MultipleInvertedIndexTask类
            MultipleConcurrentIndexing类
        比较解决方案
        其他感兴趣的方法
        摘要

    
6.分为阶段的运行任务-Phaser类

 移相器类简介
        参与者注册和注销
        同步相变
        其他功能
    第一个示例-关键字提取算法
        普通班
            单词课
            关键字类别
            文档类
            DocumentParser类
        串行版本
        并发版本
            KeywordExtractionTask类
            ConcurrentKeywordExtraction类
        比较两种解决方案
    第二个例子-遗传算法
        普通班
            个人班
            GeneticOperators类
        串行版本
            SerialGeneticAlgorithm类
            SerialMain类
        并发版本
            SharedData类
            GeneticPhaser类
            ConcurrentGeneticTask类
            ConcurrentGeneticAlgorithm类
            ConcurrentMain类
        比较两种解决方案
            Lau15数据集
            KN57数据集
            结论
    摘要

7.优化分而治之的解决方案-Fork / Join框架

 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框架的其他方法
    摘要

8.使用并行流处理海量数据集-Map and Reduce模型

    流介绍
        流的基本特征
        流的各个部分
            流的来源
            中级作业
            终端操作
        MapReduce和MapCollect
    第一个示例-数值汇总应用程序
        并发版本
        ConcurrentDataLoader类
        ConcurrentStatistics类
            来自英国的客户
            来自英国的数量
        产品所在国家
            产品数量
            多数据过滤
            最高发票金额
            单价在1到10之间的产品
        ConcurrentMain类
        串行版本
        比较两个版本
    第二个示例-信息检索搜索工具
        归约运算简介
        第一种方法-完整文档查询
            basicMapper()方法
            令牌类
            QueryResult类
        第二种方法-减少文档查询
            limitedMapper()方法
        第三种方法-生成带有结果的HTML文件
            ContentMapper类
        第四种方法-预加载倒排索引
            ConcurrentFileLoader类
        第五种方法-使用我们自己的执行器
        从倒排索引中获取数据-ConcurrentData类
        获取文件中的单词数
        获取文件中的平均tfxidf值
        获取索引中的最大和最小tfxidf值
        ConcurrentMain类
        串行版本
        比较解决方案
    摘要

9.使用并行流处理海量数据集-Map and Collect模型

使用流收集数据
        collect()方法
    第一个示例-搜索没有索引的数据
        基础班
            产品类别
            评论班
            ProductLoader类
        第一种方法-基本搜索
            ConcurrentStringAccumulator类
        第二种方法-高级搜索
            ConcurrentObjectAccumulator类
        示例的串行实现
        比较实施
    第二个例子-推荐系统
        普通班
            ProductReview类
            产品推荐类
        推荐系统-主类
        ConcurrentLoaderAccumulator类
        串行版本
        比较两个版本
    第三个示例-社交网络中的常用联系人
        base classes 
            人员类
            人员配对类
            DataLoader类
        并发版本
            CommonPersonMapper类
            ConcurrentSocialNetwork类
            ConcurrentMain类
        串行版本
            比较两个版本
        摘要

10.异步流处理-反应流

    Java反应流简介
        Flow.Publisher界面
        Flow.Subscriber接口
        Flow.Subscription接口
        SubmissionPublisher类
    第一个示例-用于事件通知的集中式系统
        活动类
        生产者类
        消费阶层
        主班
    第二个例子-新闻系统
        新闻课
        发布者类
        消费阶层
        主班
    摘要

11.分为并发数据结构和同步实用程序

    并发数据结构
        阻塞和非阻塞数据结构
        并发数据结构
            介面
                阻塞队列
                阻塞双端队列
                并发图
                传输队列
            班级
                LinkedBlockingQueue
                ConcurrentLinkedQueue
                LinkedBlockingDeque
                并发链接双端队列
                ArrayBlockingQueue
                延迟队列
                LinkedTransferQueue
                PriorityBlockingQueue
                并发哈希图
    使用新功能
        第一个使用ConcurrentHashMap的示例
            forEach()方法
            search()方法
            reduce()方法
            compute()方法
        ConcurrentHashMap的另一个示例
        ConcurrentLinkedDeque类的示例
            removeIf()方法
            spliterator()方法
        原子变量
        可变手柄
    同步机制
        CommonTask类
        锁界面
        信号量类
        CountDownLatch类
        CyclicBarrier类
        CompletableFuture类
        使用CompletableFuture类
            辅助任务
            main()方法
    摘要

12.测试和监视并发应用程序

    监控并发对象
        监控线程
        监控锁
        监视执行者
        监视fork / join框架
        监控移相器
        监控流API
    监视并发应用程序
        概述选项卡
        内存选项卡
        线程选项卡
        类别标签
        VM摘要选项卡
        MBeans选项卡
        关于标签
    测试并发应用
        使用MultithreadedTC测试并发应用程序
        使用Java Pathfinder测试并发应用程序
        安装Java Pathfinder
        运行Java Pathfinder
    摘要

13. JVM中的并发-使用Gpars库和Scala的Clojure和Groovy

    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编程语言提供的并发元素。

 

你可能感兴趣的:(java面试,java)