


内容简介
本书是Java并发编程领域公认的标准性著作,第1版自2015年出版以来,累计印刷23次,销售超过10万册,全网读者评论超过40000条,口碑爆棚。
第2版在第1版的良好基础上,与时具进,反映了Java技术的最新发展;去芜存菁:处理了广大读者反馈的问题;博采众长:吸收了行业专家的宝贵建议;厚积薄发,融入了作者近8年在Java并发编程方面积累的新技术和新经验。新增和修订的内容超过50%,无论是理论、方法还是实践,都有了大幅度的提升。
本书从并发编程的底层实现机制入手,围绕JDK源码、JVM、CPU等多角度详细介绍了设计Java并发程序的框架、原理、核心技术、设计模式与应用,同时辅以丰富的示例代码,使得开发人员能够更快地领悟Java并发编程的要领,利用Java平台的基础并发功能快速地构建大规模的并发应用。本书具体包含如下核心内容:
?Java并发编程的基础:线程。
?Java并发编程的挑战及其解决思路。
?Java 并发编程的底层实现原理,在CPU和JVM层面如何实现并发编程。
?Java 的内存模型。
?Java 并发包中与锁相关的API和组件,以及它们的使用方式与实现细节。
?Java 中并发容器的实现原理,领略大师的设计技巧。
?Java 中的原子操作类和并发工具类。
?Java 中的线程池实现原理和使用建议。
?Executor 框架的整体结构和成员组件。
?并发编程的实战案例,以及排查并发编程问题的方法。
?分布式编程的原则、范式以及常见分布式协议。
?分布式锁以及如何在分布式环境下进行并发控制。
?常见的分布式系统架构,以及多个场景的分布式架构方案。
此外,本书还是一本关于如何高效地进行分布式编程的实践指南,提供了很多实用的分布式编程技巧和工具,让读者更好地应对分布式编程挑战,掌握Java生态在分布式领域的新编程范式。
封面
前折页
书名页
版权
赞誉
前言
第1章 Java并发编程基础
1.1 线程简介
1.1.1 什么是线程
1.1.2 为什么要使用多线程
1.1.3 线程优先级
1.1.4 线程的状态
1.1.5 Daemon线程
1.2 启动和终止线程
1.2.1 构造线程
1.2.2 启动线程
1.2.3 理解中断
1.2.4 过期的suspend()、resume()和stop()
1.2.5 安全地终止线程
1.3 线程间通信
1.3.1 volatile和synchronized关键字
1.3.2 等待/通知机制
1.3.3 等待/通知的经典范式
1.3.4 管道输入/输出流
1.3.5 thread.join()的使用
1.3.6 ThreadLocal的使用
1.4 线程应用实例
1.4.1 等待超时模式
1.4.2 一个简单的数据库连接池示例
1.4.3 线程池技术及其示例
1.4.4 一个基于线程池技术的简单Web服务器
1.5 本章小结
第2章 并发编程的挑战
2.1 上下文切换
2.1.1 多线程一定快吗
2.1.2 测试上下文切换次数和时长
2.1.3 如何减少上下文切换
2.1.4 减少上下文切换实战
2.2 死锁
2.3 资源限制的挑战
2.4 本章小结
第3章 Java并发机制的底层实现原理
3.1 volatile的应用
3.2 synchronized的实现原理与应用
3.2.1 Java对象头
3.2.2 锁的升级与对比
3.3 原子操作的实现原理
3.4 本章小结
第4章 Java内存模型
4.1 Java内存模型基础
4.1.1 并发编程模型的两个关键问题
4.1.2 Java内存模型的抽象结构
4.1.3 从源代码到指令序列的重排序
4.1.4 并发编程模型的分类
4.1.5 happens-before简介
4.2 重排序
4.2.1 数据依赖性
4.2.2 as-if-serial语义
4.2.3 程序顺序规则
4.2.4 重排序对多线程的影响
4.3 顺序一致性
4.3.1 数据竞争与顺序一致性
4.3.2 顺序一致性内存模型
4.3.3 同步程序的顺序一致性效果
4.3.4 未同步程序的执行特性
4.4 volatile的内存语义
4.4.1 volatile的特性
4.4.2 volatile写-读建立的happens-before关系
4.4.3 volatile写-读的内存语义
4.4.4 volatile内存语义的实现
4.4.5 JSR-133为什么要增强volatile的内存语义
4.5 锁的内存语义
4.5.1 锁的释放-获取建立的happens-before关系
4.5.2 锁的释放和获取的内存语义
4.5.3 锁内存语义的实现
4.5.4 concurrent包的实现
4.6 final域的内存语义
4.6.1 final域的重排序规则
4.6.2 写final域的重排序规则
4.6.3 读final域的重排序规则
4.6.4 final域为引用类型
4.6.5 为什么final引用不能在构造函数中“逸出”
4.6.6 final语义在处理器中的实现
4.6.7 JSR-133为什么要增强final的语义
4.7 happens-before
4.7.1 JMM的设计
4.7.2 happens-before的定义
4.7.3 happens-before规则
4.8 双重检查锁定与延迟初始化
4.8.1 双重检查锁定的由来
4.8.2 问题的根源
4.8.3 基于volatile的解决方案
4.8.4 基于类初始化的解决方案
4.9 Java内存模型综述
4.9.1 处理器的内存模型
4.9.2 各种内存模型之间的关系
4.9.3 JMM的内存可见性保证
4.9.4 JSR-133对旧内存模型的修补
4.10 JDK 9内存顺序模型
4.10.1 背景
4.10.2 Plain
4.10.3 Opaque
4.10.4 Release/Acquire
4.10.5 volatile
4.10.6 总结
4.11 本章小结
第5章 Java中的锁
5.1 Lock接口
5.2 队列同步器
5.2.1 队列同步器的接口与示例
5.2.2 队列同步器的实现分析
5.3 重入锁
5.4 读写锁
5.4.1 读写锁的接口与示例
5.4.2 读写锁的实现分析
5.5 StampedLock
5.5.1 StampedLock的接口与示例
5.5.2 StampedLock的实现分析
5.6 LockSupport工具
5.7 Condition接口
5.7.1 Condition的接口与示例
5.7.2 Condition的实现分析
5.8 本章小结
第6章 Java并发容器和框架
6.1 ConcurrentHashMap的实现原理与使用
6.1.1 为什么要使用ConcurrentHashMap
6.1.2 ConcurrentHashMap的结构
6.1.3 ConcurrentHashMap的初始化
6.1.4 定位Segment
6.1.5 ConcurrentHashMap的操作
6.1.6 JDK 8中的ConcurrentHashMap
6.2 ConcurrentLinkedQueue
6.2.1 ConcurrentLinkedQueue的结构
6.2.2 入队列
6.2.3 出队列
6.3 Java中的阻塞队列
6.3.1 什么是阻塞队列
6.3.2 7个阻塞队列
6.3.3 阻塞队列的实现原理
6.4 Fork/Join框架
6.4.1 什么是Fork/Join框架
6.4.2 工作窃取算法
6.4.3 Fork/Join框架的设计
6.4.4 使用Fork/Join框架
6.4.5 Fork/Join框架的异常处理
6.4.6 Fork/Join框架的实现原理
6.5 本章小结
第7章 Java中的13个原子操作类
7.1 原子更新基本类型
7.2 原子更新数组类型
7.3 原子更新引用类型
7.4 原子更新字段类型
7.5 JDK 8中的原子更新新特性
7.6 本章小结
第8章 Java中的并发工具类
8.1 等待多线程完成的CountDownLatch
8.2 同步屏障CyclicBarrier
8.2.1 CyclicBarrier简介
8.2.2 CyclicBarrier的应用场景
8.2.3 CyclicBarrier和CountDownLatch的区别
8.3 控制并发线程数的Semaphore
8.4 线程间交换数据的Exchanger
8.5 本章小结
第9章 Java中的线程池
9.1 线程池的实现原理
9.2 线程池的使用
9.2.1 线程池的创建
9.2.2 向线程池提交任务
9.2.3 关闭线程池
9.2.4 合理地配置线程池
9.2.5 线程池的监控
9.3 本章小结
第10章 Executor框架
10.1 Executor框架简介
10.1.1 Executor框架的两级调度模型
10.1.2 Executor框架的结构与成员
10.2 ThreadPoolExecutor详解
10.2.1 FixedThreadPool详解
10.2.2 SingleThreadExecutor详解
10.2.3 CachedThreadPool详解
10.3 ScheduledThreadPoolExecutor详解
10.3.1 ScheduledThreadPoolExecutor的运行机制
10.3.2 ScheduledThreadPoolExecutor的实现
10.4 FutureTask详解
10.4.1 FutureTask简介
10.4.2 FutureTask的使用
10.4.3 JDK 6的FutureTask实现
10.4.4 JDK 8的FutureTask实现
10.5 本章小结
第11章 Java并发编程实践
11.1 生产者和消费者模式
11.1.1 生产者和消费者模式实战
11.1.2 多生产者和多消费者场景
11.1.3 线程池与生产者和消费者模式
11.2 线上问题定位
11.3 性能测试
11.4 异步任务池
11.5 本章小结
第12章 分布式编程基础
12.1 分布式CAP原则
12.1.1 CAP原则简介
12.1.2 CAP原则证明
12.1.3 CAP原则思考
12.2 分布式事务:两阶段提交
12.2.1 分布式事务面临的挑战
12.2.2 拜占庭将军问题
12.2.3 两阶段提交协议
12.2.4 对两阶段提交的思考
12.3 分布式事务:TCC
12.3.1 TCC的主要优势
12.3.2 TCC的使用代价
12.3.3 支持TCC的Seata
12.3.4 一个基于Seata的参考示例
12.4 分布式协议:RAFT
12.4.1 RAFT的运行流程
12.4.2 集群中断和恢复
12.5 分布式协议:Paxos
12.5.1 背景
12.5.2 Basic Paxos
12.5.3 Multi-Paxos
12.6 本章小结
第13章 分布式锁
13.1 什么是分布式锁
13.1.1 分布式锁的定义
13.1.2 使用分布式锁的原因
13.1.3 分布式锁的分类
13.2 实现分布式锁会遇到的问题
13.2.1 性能问题
13.2.2 正确性问题
13.2.3 可用性问题
13.2.4 成本问题
13.3 分布式锁框架
13.3.1 为什么需要分布式锁框架
13.3.2 分布式锁框架的组成
13.3.3 实现:基于Redis的分布式锁
13.3.4 扩展:分布式锁访问日志
13.4 拉模式的分布式锁
13.4.1 什么是拉模式
13.4.2 拉模式需要注意的问题
13.4.3 Redis分布式锁实现
13.4.4 Redis分布式锁存在的问题
13.4.5 扩展:本地热点锁
13.5 推模式的分布式锁
13.5.1 什么是推模式
13.5.2 ZooKeeper如何实现推模式的分布式锁
13.5.3 Curator分布式锁
13.5.4 ZooKeeper分布式锁实现
13.5.5 ZooKeeper分布式锁存在的问题
13.6 再看分布式锁
13.6.1 比选择推与拉更重要的是什么
13.6.2 解锁胜于用锁
13.7 本章小结
第14章 分布式系统架构
14.1 分布式场景下的限流架构方案
14.1.1 限流算法
14.1.2 基于Redis的分布式限流
14.1.3 基于Sentinel的分布式限流
14.2 分布式场景下的秒杀架构方案
14.2.1 背景
14.2.2 需求分析
14.2.3 用例分析
14.2.4 秒杀流程图
14.2.5 关键设计:库存设计
14.2.6 关键设计:秒杀令牌
14.3 分布式场景下的高并发架构方案
14.3.1 应对高并发的常用策略
14.3.2 减少强依赖
14.3.3 多层故障隔离
14.3.4 五种架构选型
14.3.5 三种缓存设计方案
14.4 分布式场景下的资损防控
14.4.1 资损的定义
14.4.2 如何进行资损防控
14.4.3 第一道防线:事前规避
14.4.4 第二道防线:事中定位
14.4.5 第三道防线:事后应急
14.4.6 如何进行资损演练
14.5 分布式场景下的稳定性保障
14.5.1 什么是稳定性保障
14.5.2 明确稳定性保障目标
14.5.3 如何进行稳定性保障
14.5.4 大促稳定性保障
14.6 本章小结
后折页
封底
机械工业出版社 京icp备14043556号-1 (署)网出证(京)字第214号 Copyright (C) 2001 CmpBook. All Rights Reserved