实战Java高并发程序设计pdf下载|百度网盘下载

时间: 2022-05-09 03:03:34  6 线程 线程 线程池

编辑评论:

实用Java高并发编程pdf是一本以java程序为主题的教材,主要讲java并行程序的基础知识、jdk并发包、锁优化、并行模式与算法、并行程序调试等。

实用Java高并发编程pdf

实用Java高并发编程pdf内容

在单核 CPU 时代,单个任务一次只能执行一个程序。随着多核CPU的发展,并行程序开发变得尤为重要。

《实用Java高并发编程(第二版)》主要介绍了基于Java的并行编程的基础、思想、方法和实战。首先,基于并发编程的基础,详细介绍了Java并行编程的基本方法。其次,进一步详细介绍了JDK对并行程序的强大支持,帮助读者快速稳定地开发并行程序。第三,详细讨论了“锁”的优化以及提高并行程序性能水平的方法和思路。第四,介绍了并行的基本设计模式,以及Java 8/9/10对并行程序的支持和改进。第五,介绍高并发框架Akka的使用。第六,详细介绍了并行程序的调试方法。第七,分析Jetty代码,举几个例子说明它的高并发优化。

《实用Java高并发编程(第二版)》内容丰富,典型例子,实用性强,适合有一定Java基础的技术开发人员阅读。

关于电子书的作者

葛一鸣,51CTO特约讲师,国家认证体系分析师,获得OracleOCP认证。长期从事Java软件开发,对Java编程和JVM有深入研究,对设计模式、人工智能、神经网络、数据挖掘等技术有着浓厚的兴趣。 《实用Java虚拟机》一书。

郭超,就职于杭州市道路交通管理局信息中心,主要从事大型交通管理系统的分布式管理和并发模型设计,对Java有深入的研究,专注于分布式应用程序和并发应用程序。

pdf在线试读

可访问性是最弱的非阻塞调度。如果两个线程没有阻塞地执行,那么它们就不会因为临界区的问题而被挂起。也就是说,每个人都可以大摇大摆地进入临界区。那么如果每个人都一起修改共享数据并破坏数据怎么办?对于一个畅通无阻的线程,一旦检测到这种情况,它会立即回滚自己的修改,以确保数据安全。但如果没有数据竞争,线程可以成功完成其工作并脱离临界区。

如果阻塞控制方法是一种悲观策略。也就是说,系统认为两个线程之间很可能发生不幸的冲突,因此将保护共享数据作为第一优先级。相对而言,非阻塞调度是一种乐观的策略。它认为多线程之间不会发生冲突的概率很大,或者概率不大。所以每个人都应该毫无问题地执行,但是一旦检测到冲突,就应该进行回滚。

从这个策略也可以看出,无障碍多线程程序并不一定能流畅运行。因为当临界区发生严重冲突时,所有线程都可能不断地回滚自己的操作,没有一个线程可以脱离临界区。这种情况会影响系统的正常执行。因此,我们可能非常希望在这一堆线程中,至少有一个线程能够在有限的时间内完成自己的操作并退出临界区。至少这确保了系统不会在临界区无限期地等待。

可行的可访问性实现可以依靠“一致性标志”来做到这一点。操作前,线程先读取并保存标签,操作完成后再次读取,检查标签是否被改变。如果两者一致,则说明资源访问不存在冲突。如果不一致,则该资源可能在操作过程中与其他写入线程发生冲突,需要重试操作。任何修改资源的线程都需要在修改数据之前更新一致性标志,表明数据不再安全。

书籍内容

第 1 章进入平行世界

1.1 并行计算何去何从

1.1.1 忘记该死的并行性

1.1.2 可怕的现实:摩尔定律的失败

1.1.3 黑柳:继续前进

1.1.4 明暗

1.2 你必须知道的几个概念

1.2.1 同步和异步

1.2.2 并发和并行

1.2.3 关键部分

1.2.4 阻塞和非阻塞

1.2.5 死锁、饥饿和活锁

1.3 并发级别

1.3.1 阻塞

1.3.2 无饥饿

1.3.3 无障碍

1.3.4 无锁

1.3.5 无需等待

1.4 关于并行性的两个重要定律

1.4.1 阿姆达尔定律

1.4.2 古斯塔夫森定律

1.4.3 它们是否相互矛盾

1.5 返回Java:

1.5.1 原子性

1.5.2 可见性

1.5.3 订购

1.5.4 哪些指令不能重排:Happen-Before 规则

第 2 章 Java 并行程序基础

2.1 关于线程你必须知道的事情

2.2 初始线程:线程的基本操作

2.2.1 新线程

2.2.2 终止线程

2.2.3 线程中断

2.2.4 等待并通知

2.2.5 暂停和恢复线程

2.2.6 等待线程结束(join)和yield(yield)

2.3 volatile 和 Java 内存模型 (JMM)

2.4 分类管理:线程组

2.5 驻留后台:守护线程(Daemon)

2.6 先做重要的事:线程优先级

2.7 线程安全的概念和关键字

2.8 程序中的幽灵:隐藏的错误

2.8.1 静默错误案例

2.8.2 并发下

2.8.3 并发很奇怪

2.8.4 初学者常见问题:锁错

第 3 章 JDK 并发

3.1 多线程团队合作:同步控制

3.1.1 关键字synchronized的功能扩展:可重入锁

3.1.2 可重入锁的好搭档:

3.1.3 允许多个线程同时访问:信号量

3.1.4 读写锁

3.1.5 倒计时:

3.1.6 圆形围栏:

3.1.7 线程阻塞工具类:

3.1.8 Guava 和 RateLimiter 限流

3.2 线程复用:线程池

3.2.1 什么是线程池

3.2.2 不要重新发明轮子:JDK 对线程池的支持

3.2.3 深究:核心线程池的内部实现

3.2.4 过载怎么办:拒绝策略

3.2.5 自定义线程创建:

3.2.6 我的应用是我自己的:扩展线程池

3.2.7 合理选择:优化线程池中的线程数

3.2.8 栈去哪了:在线程池中找栈

3.2.9 分而治之:Fork/Join 框架

3.2.10 Guava中线程池的扩展

3.3 不要重新发明轮子:JDK 的并发容器

3.3.1 超级好用的工具类:并发集合介绍

3.3.2 线程安全

3.3.3 关于List的线程安全

3.3.4 高效读写队列:ConcurrentLinkedQueue类深度解析

3.3.5 高效读取:不可变模式下的CopyOnWriteArrayList类

3.3.6 数据共享渠道:

3.3.7 随机数据结构:SkipList

3.4 使用 JMH 进行性能测试

3.4.1 什么是

3.4.3 JMH的基本概念和配置

3.4.4 了解 JMH

3.4.5 了解 JMH

3.4.6 关于性能的一些想法

3.4.7 CopyOnWriteArrayList 和 ConcurrentLinkedQueue

第四章锁优化及注意事项

4.1 提高锁性能的建议

4.1.1 减少锁持有时间

4.1.2 降低锁粒度

4.1.3 用读写分离锁代替排他锁

4.1.4 锁分离

4.1.5 锁粗化

4.2 Java 虚拟机优化锁的努力

4.2.1 锁定偏差

4.2.2 轻量级锁

4.2.3 自旋锁

4.2.4 解除锁

4.3 每人一支笔:

4.3.1 ThreadLocal的简单使用

4.3.2 ThreadLocal的实现原理

4.3.3 如何提升性能

4.4 解锁

4.4.1 不同的并发策略:比较交换

4.4.2 无锁线程安全整数:

4.4.3 Java 中的指针:不安全类

4.4.4 无锁对象引用:

4.4.5 带有时间戳的对象引用:

4.4.6 数组也可以是无锁的:

4.4.7 让普通变量也能享受原子操作:

4.4.8 挑战无锁算法:无锁向量实现

4.4.9 让线程互相帮助:细看SynchronousQueue的实现

4.5 关于死锁的问题

第 5 章并行模式和算法

5.1 探索单例模式

5.2 不变模式

5.3 生产者-消费者模型

5.4 高性能生产者-消费者模式:无锁实现

5.4.1 无锁缓存框架:

5.4.2 Disruptor框架实现生产者-消费者模式的案例

5.4.3 缩短消费者响应时间:选择正确的策略

5.4.4 CPU Cache优化:解决虚假共享问题

5.5 未来模式

5.5.1 Future模式的主要作用

5.5.2 未来模式的简单实现

5.5.3 JDK 中的未来模式

5.5.4 Guava 对 Future 模式的支持

5.6 并行管道

5.7 并行搜索

5.8 并行排序

5.8.1 分离数据依赖:奇偶交换排序

5.8.2 改进的插入排序:希尔排序

5.9 并行算法:矩阵乘法

5.10 准备就绪时通知我:网络

5.10.1 基于Socket的服务器多线程模式

5.10.2 使用 NIO 进行网络编程

5.10.3 使用NIO实现客户端

看完5.11后通知我:

5.11.1 AIO EchoServer的实现

5.11.2 AIO Echo 客户端的实现

第 6 章 Java 8/9/10 和并发

6.1 Java 8 函数式编程简介

6.1.1 作为一等公民的职能

6.1.2 无副作用

6.1.3 声明式

6.1.4 不可变对象

6.1.5 易于并行

6.1.6 更少的代码

6.2 函数式编程基础

6.2.1 功能接口注解

6.2.2 接口默认方法

6.2.3 lambda 表达式

6.2.4 方法参考

6.3 逐步进入函数式编程

6.4 并行流和并行排序

6.4.1 使用并行流过滤数据

6.4.2 从集合中获取并行流

6.4.3 并行排序

6.5 增强未来:

6.5.1 完成时通知我

6.5.2 异步执行任务

6.5.3 流式调用

6.5.4 CompletableFuture 中的异常处理

6.5.5 组合多个

6.5.6 支持超时

6.6 读写锁改进:

6.6.1 StampedLock 使用示例

6.6.2 StampedLock 的小陷阱

6.6.3 关于StampedLock的实现思路

6.7 原子类增强

6.7.1 更快的原子类:

6.7.2 LongAdder功能增强版:

6.8 ConcurrentHashMap 增强

6.8.1 foreach 操作

6.8.2 归约操作

6.8.3 条件插入

6.8.4 搜索操作

6.8.5 其他新方法

6.9 发布和订阅模式

6.9.1 简单的发布-订阅示例

6.9.2 数据处理链

第 7 章使用 Akka 构建高并发程序

7.1 新的并发模型:

Akka 的 7.2

7.3 关于消息传递的一些注意事项

7.4 Actor 生命周期

7.5 监控策略

7.6 选择

7.7 消息收件箱

7.8 消息路由

7.9 Actor 的内置状态转换

7.10 查询模式:在 Actors 中

7.11 多个Actor同时修改数据:

7.12 像数据库一样操作内存中的数据:软件事务内存

7.13 一个有趣的例子:并发粒子群的实现

7.13.1 什么是粒子群优化

7.13.2 粒子群优化的计算过程

7.13.3 粒子群优化能做什么

7.13.4 使用 Akka 实现粒子群

第8章并行程序调试

8.1 准备实验样品

8.2 正式起航

8.3 挂起整个虚拟机

8.4 调试到 ArrayList

第 9 章多线程优化示例 - Jetty 核心代码分析

9.1 Jetty简介及架构

9.2 码头服务器初始化

9.2.1 初始化线程池

9.2.2 初始化

9.2.3 初始化

9.2.4 维护

9.2.5 计算ServerConnector的线程数

9.3 启动码头服务器

9.3.1 设置启动状态

9.3.2 注册

9.3.3 统计系统中的线程数

9.3.4 启动

9.3.5 启动

9.4 处理 HTTP 请求

9.4.1 接受成功

9.4.2 请求处理

  • 声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,以上内容仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站内容来自网络收集整理或网友投稿,所提供的下载链接也是站外链接,版权争议与本站无关。您必须在下载后的24个小时之内,从您的设备中彻底删除上述内容。如果您喜欢该程序和内容,请支持正版!我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!邮箱:121671486@qq.com,微信:diqiuren010101

学习考试资源网-58edu © All Rights Reserved.  湘ICP备12013312号-3 
站点地图| 免责说明| 合作请联系| 友情链接:学习乐园