Java高并发核心编程(共二册)

Java高并发核心编程(共二册)

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

因版权原因待上架

编辑推荐

入大厂、做架构的坚实基础。

内容简介

本套书包括《Java高并发核心编程·卷1,NIO、Netty、Redis、ZooKeeper》《Java高并发核心编程·卷2,多线程、锁、JMM、JUC、高并发设计模式》共两册。

《Java高并发核心编程·卷1,NIO、Netty、Redis、ZooKeeper》:本书从操作系统底层的IO原理入手讲解Java高并发核心编程知识,同时提供高性能开发的实战案例,是一本Java高并发编程的基础原理和实战图书。本书兼具基础知识和实战案例,既可作为对Java NIO、高性能IO、高并发编程感兴趣的大专院校学生以及初/中级Java工程师的自学图书,也可作为在生产项目中需要用到Netty、Redis、ZooKeeper三大框架的架构师或项目人员的参考书。

《Java高并发核心编程·卷2,多线程、锁、JMM、JUC、高并发设计模式》:本书聚焦Java高并发编程基础知识,介-绍Java多线程、线程池、内置锁、JMM、CAS、JUC、高并发设计模式等并发编程方面的核心原理和实战知识。本书共10章,既可以作为Java工程师、架构师的编程参考书,又可以作为参加互联网大厂面试、笔试的人员的学习参考书。

作者简介

作者尼恩,架构师。有17年开发经验、10年架构经验。

章节目录

Java高并发核心编程 卷1:NIO、Netty、Redis、ZooKeeper

版权信息

作者简介

前言

本书内容

读者对象

本书源代码下载

勘误和支持

致谢

自序

第1章 高并发时代的必备技能

1.1 Netty为何这么火

1.1.1 Netty火热的程度

1.1.2 Netty是面试的必杀器

1.2 高并发利器Redis

1.2.1 什么是Redis

1.2.2 Redis成为缓存事实标准的原因

1.3 分布式利器ZooKeeper

1.3.1 什么是ZooKeeper

1.3.2 ZooKeeper的优势

1.4 高性能HTTP通信技术

1.4.1 十万级以上高并发场景中的高并发HTTP通信技术

1.4.2 微服务之间的高并发RPC技术

1.5 高并发IM的综合实战

1.5.1 高并发IM的学习价值

1.5.2 庞大的应用场景

第2章 高并发IO的底层原理

2.1 IO读写的基本原理

2.1.1 内核缓冲区与进程缓冲区

2.1.2 典型的系统调用流程

2.2 四种主要的IO模型

2.2.1 同步阻塞IO

2.2.2 同步非阻塞IO

2.2.3 IO多路复用

2.2.4 异步IO

2.3 通过合理配置来支持百万级并发连接

第3章 Java NIO核心详解

3.1 Java NIO简介

3.1.1 NIO和OIO的对比

3.1.2 通道

3.1.3 选择器

3.1.4 缓冲区

3.2 详解NIO Buffer类及其属性

3.2.1 Buffer类

3.2.2 Buffer类的重要属性

3.3 详解NIO Buffer类的重要方法

3.3.1 allocate()

3.3.2 put()

3.3.3 flip()

3.3.4 get()

3.3.5 rewind()

3.3.6 mark()和reset()

3.3.7 clear()

3.3.8 使用Buffer类的基本步骤

3.4 详解NIO Channel类

3.4.1 FileChannel

3.4.2 使用FileChannel完成文件复制的实战案例

3.4.3 SocketChannel

3.4.4 使用SocketChannel发送文件的实战案例

3.4.5 DatagramChannel

3.4.6 使用DatagramChannel发送数据的实战案例

3.5 详解NIO Selector

3.5.1 选择器与注册

3.5.2 SelectableChannel

3.5.3 SelectionKey

3.5.4 选择器使用流程

3.5.5 使用NIO实现Discard服务器的实战案例

3.5.6 使用SocketChannel在服务端接收文件的实战案例

第4章 鼎鼎大名的Reactor模式

4.1 Reactor模式的重要性

4.1.1 为什么首先学习Reactor模式

4.1.2 Reactor模式简介

4.1.3 多线程OIO的致命缺陷

4.2 单线程Reactor模式

4.2.1 什么是单线程Reactor

4.2.2 单线程Reactor的参考代码

4.2.3 单线程Reactor模式的EchoServer的实战案例

4.2.4 单线程Reactor模式的缺点

4.3 多线程Reactor模式

4.3.1 多线程版本的Reactor模式演进

4.3.2 多线程版本Reactor的实战案例

4.3.3 多线程版本Handler的实战案例

4.4 Reactor模式的优缺点

第5章 Netty核心原理与基础实战

5.1 第一个Netty实战案例DiscardServer

5.1.1 创建第一个Netty项目

5.1.2 第一个Netty服务端程序

5.1.3 业务处理器NettyDiscardHandler

5.1.4 运行NettyDiscardServer

5.2 解密Netty中的Reactor模式

5.2.1 回顾Reactor模式中IO事件的处理流程

5.2.2 Netty中的Channel

5.2.3 Netty中的Reactor

5.2.4 Netty中的Handler

5.2.5 Netty中的Pipeline

5.3 详解Bootstrap

5.3.1 父子通道

5.3.2 EventLoopGroup

5.3.3 Bootstrap启动流程

5.3.4 ChannelOption

5.4 详解Channel

5.4.1 Channel的主要成员和方法

5.4.2 EmbeddedChannel

5.5 详解Handler

5.5.1 ChannelInboundHandler入站处理器

5.5.2 ChannelOutboundHandler出站处理器

5.5.3 ChannelInitializer通道初始化处理器

5.5.4 ChannelInboundHandler的生命周期的实战案例

5.6 详解Pipeline

5.6.1 Pipeline入站处理流程

5.6.2 Pipeline出站处理流程

5.6.3 ChannelHandlerContext

5.6.4 HeadContext与TailContext

5.6.5 Pipeline入站和出站的双向链接操作

5.6.6 截断流水线的入站处理传播过程

5.6.7 在流水线上热插拔Handler

5.7 详解ByteBuf

5.7.1 ByteBuf的优势

5.7.2 ByteBuf的组成部分

5.7.3 ByteBuf的重要属性

5.7.4 ByteBuf的方法

5.7.5 ByteBuf基本使用的实战案例

5.7.6 ByteBuf的引用计数

5.7.7 ByteBuf的分配器

5.7.8 ByteBuf缓冲区的类型

5.7.9 两类ByteBuf使用的实战案例

5.7.10 ByteBuf的自动创建与自动释放

5.7.11 ByteBuf浅层复制的高级使用方式

5.8 Netty的零拷贝

5.8.1 通过CompositeByteBuf实现零拷贝

5.8.2 通过wrap操作实现零拷贝

5.9 EchoServer的实战案例

5.9.1 NettyEchoServer

5.9.2 NettyEchoServerHandler

5.9.3 NettyEchoClient

5.9.4 NettyEchoClientHandler

第6章 Decoder与Encoder核心组件

6.1 Decoder原理与实战

6.1.1 ByteToMessageDecoder解码器处理流程

6.1.2 自定义Byte2IntegerDecoder整数解码器

6.1.3 ReplayingDecoder解码器

6.1.4 整数的分包解码器的实战案例

6.1.5 字符串的分包解码器的实战案例

6.1.6 MessageToMessageDecoder解码器

6.2 常用的内置Decoder

6.2.1 LineBasedFrameDecoder解码器

6.2.2 DelimiterBasedFrameDecoder解码器

6.2.3 LengthFieldBasedFrameDecoder解码器

6.2.4 多字段Head-Content协议数据包解析的实战案例

6.3 Encoder原理与实战

6.3.1 MessageToByteEncoder编码器

6.3.2 MessageToMessageEncoder编码器

6.4 解码器和编码器的结合

6.4.1 ByteToMessageCodec编解码器

6.4.2 CombinedChannelDuplexHandler组合器

第7章 序列化与反序列化:JSON和Protobuf

7.1 详解粘包和拆包

7.1.1 半包问题的实战案例

7.1.2 什么是半包问题

7.1.3 半包问题的根因分析

7.2 使用JSON协议通信

7.2.1 JSON的核心优势

7.2.2 JSON序列化与反序列化开源库

7.2.3 JSON序列化与反序列化的实战案例

7.2.4 JSON传输的编码器和解码器

7.2.5 JSON传输的服务端的实战案例

7.2.6 JSON传输的客户端的实战案例

7.3 使用Protobuf协议通信

7.3.1 一个简单的proto文件的实战案例

7.3.2 通过控制台命令生成POJO和Builder

7.3.3 通过Maven插件生成POJO和Builder

7.3.4 Protobuf序列化与反序列化的实战案例

7.4 Protobuf编解码的实战案例

7.4.1 Netty内置的Protobuf基础编码器/解码器

7.4.2 Protobuf传输的服务端的实战案例

7.4.3 Protobuf传输的客户端的实战案例

7.5 详解Protobuf协议语法

7.5.1 proto文件的头部声明

7.5.2 Protobuf的消息结构体与消息字段

7.5.3 Protobuf字段的数据类型

7.5.4 proto文件的其他语法规范

第8章 基于Netty单体IM系统的开发实战

8.1 自定义Protobuf编解码器

8.1.1 自定义Protobuf编码器

8.1.2 自定义Protobuf解码器

8.1.3 IM系统中Protobuf消息格式的设计

8.2 IM的登录流程

8.2.1 图解登录/响应流程的环节

8.2.2 客户端涉及的主要模块

8.2.3 服务端涉及的主要模块

8.3 客户端的登录处理的实战案例

8.3.1 LoginConsoleCommand和User POJO

8.3.2 LoginSender

8.3.3 ClientSession

8.3.4 LoginResponseHandler

8.3.5 客户端流水线的装配

8.4 服务端的登录响应的实战案例

8.4.1 服务端流水线的装配

8.4.2 LoginRequestHandler

8.4.3 LoginProcesser

8.4.4 EventLoop线程和业务线程相互隔离

8.5 详解Session服务器会话

8.5.1 通道的容器属性

8.5.2 ServerSession服务端会话类

8.5.3 SessionMap会话管理器

8.6 点对点单聊的实战案例

8.6.1 单聊的端到端流程

8.6.2 客户端的ChatConsoleCommand收集聊天内容

8.6.3 客户端的CommandController发送POJO

8.6.4 服务端的ChatRedirectHandler进行消息转发

8.6.5 服务端的ChatRedirectProcesser进行异步消息转发

8.6.6 客户端的ChatMsgHandler聊天消息处理器

8.7 详解心跳检测

8.7.1 网络连接的假死现象

8.7.2 服务端的空闲检测

8.7.3 客户端的心跳发送

第9章 HTTP原理与Web服务器实战

9.1 高性能Web应用架构

9.1.1 十万级并发的Web应用架构

9.1.2 千万级高并发的Web应用架构

9.2 详解HTTP应用层协议

9.2.1 HTTP简介

9.2.2 HTTP的请求URL

9.2.3 HTTP的请求报文

9.2.4 HTTP的响应报文

9.2.5 HTTP中GET和POST的区别

9.3 HTTP的演进

9.3.1 HTTP的1.0版本

9.3.2 HTTP的1.1版本

9.3.3 HTTP的2.0版本

9.4 基于Netty实现简单的Web服务器

9.4.1 基于Netty的HTTP服务器演示实例

9.4.2 基于Netty的HTTP请求的处理流程

9.4.3 Netty内置的HTTP报文解码流程

9.4.4 基于Netty的HTTP响应编码流程

9.4.5 HttpEchoHandler回显业务处理器的实战案例

9.4.6 使用Postman发送多种类型的请求体

第10章 高并发HTTP通信的核心原理

10.1 需要进行HTTP连接复用的高并发场景

10.1.1 反向代理Nginx与Java Web应用服务之间的HTTP高并发通信

10.1.2 微服务网关与微服务Provider实例之间的HTTP高并发通信

10.1.3 分布式微服务Provider实例之间的RPC的HTTP高并发通信

10.1.4 Java通过HTTP客户端访问REST接口服务的HTTP高并发通信

10.2 详解传输层TCP

10.2.1 TCP/IP的分层模型

10.2.2 HTTP报文传输原理

10.2.3 TCP的报文格式

10.2.4 TCP的三次握手

10.2.5 TCP的四次挥手

10.2.6 三次握手、四次挥手的常见面试题

10.3 TCP连接状态的原理与实验

10.3.1 TCP/IP连接的11种状态

10.3.2 通过netstat指令查看连接状态

10.4 HTTP长连接原理

10.4.1 HTTP长连接和短连接

10.4.2 不同HTTP版本中的长连接选项

10.5 服务端HTTP长连接技术

10.5.1 应用服务器Tomcat的长连接配置

10.5.2 Nginx承担服务端角色时的长连接配置

10.5.3 服务端长连接设置的注意事项

10.6 客户端HTTP长连接技术原理与实验

10.6.1 HttpURLConnection短连接技术

10.6.2 HTTP短连接的通信实验

10.6.3 Apache HttpClient客户端的HTTP长连接技术

10.6.4 Apache HttpClient客户端长连接实验

10.6.5 Nginx承担客户端角色时的长连接技术

第11章 WebSocket原理与实战

11.1 WebSocket协议简介

11.1.1 Ajax短轮询和Long Poll长轮询的原理

11.1.2 WebSocket与HTTP之间的关系

11.2 WebSocket回显演示程序开发

11.2.1 WebSocket回显程序的客户端代码

11.2.2 WebSocket相关的Netty内置处理类

11.2.3 WebSocket的回显服务器

11.2.4 WebSocket的业务处理器

11.3 WebSocket协议通信的原理

11.3.1 抓取WebSocket协议的本机数据包

11.3.2 WebSocket握手过程

11.3.3 WebSocket通信报文格式

第12章 SSL/TLS核心原理与实战

12.1 什么是SSL/TLS

12.1.1 SSL/TLS协议的版本演进

12.1.2 SSL/TLS协议的分层结构

12.2 加密算法原理与实战

12.2.1 哈希单向加密算法原理与实战

12.2.2 对称加密算法原理与实战

12.2.3 非对称加密算法原理与实战

12.2.4 数字签名原理与实战

12.3 SSL/TLS运行过程

12.3.1 SSL/TLS第一阶段握手

12.3.2 SSL/TLS第二阶段握手

12.3.3 SSL/TLS第三阶段握手

12.3.4 SSL/TLS第四阶段握手

12.4 详解Keytool工具

12.4.1 数字证书与身份识别

12.4.2 存储密钥与证书文件格式

12.4.3 使用Keytool工具管理密钥和证书

12.5 使用Java程序管理密钥与证书

12.5.1 使用Java操作数据证书所涉及的核心类

12.5.2 使用Java程序创建密钥与仓库

12.5.3 使用Java程序导出证书文件

12.5.4 使用Java程序将数字证书导入信任仓库

12.6 OIO通信中的SSL/TLS使用实战

12.6.1 JSSE安全套接字扩展核心类

12.6.2 JSSE安全套接字的创建过程

12.6.3 OIO安全通信的Echo服务端实战

12.6.4 OIO安全通信的Echo客户端实战

12.7 单向认证与双向认证

12.7.1 SSL/TLS单向认证

12.7.2 使用证书信任管理器

12.7.3 SSL/TLS双向认证

12.8 Netty通信中的SSL/TLS使用实战

12.8.1 Netty安全通信演示实例

12.8.2 Netty内置SSLEngine处理器详解

12.8.3 Netty的简单安全聊天器服务端程序

12.9 HTTPS协议安全通信实战

12.9.1 使用Netty实现HTTPS回显服务端程序

12.9.2 通过HttpsURLConnection发送HTTPS请求

12.9.3 HTTPS服务端与客户端的测试用例

第13章 ZooKeeper分布式协调

13.1 ZooKeeper伪集群安装和配置

13.1.1 创建数据目录和日志目录

13.1.2 创建myid文本文件

13.1.3 创建和修改配置文件

13.1.4 配置文件示例

13.1.5 启动ZooKeeper伪集群

13.2 使用ZooKeeper进行分布式存储

13.2.1 详解ZooKeeper存储模型

13.2.2 zkCli客户端指令清单

13.3 ZooKeeper应用开发实战

13.3.1 ZkClient开源客户端

13.3.2 Curator开源客户端

13.3.3 准备Curator开发环境

13.3.4 创建Curator客户端实例

13.3.5 通过Curator创建节点

13.3.6 通过Curator读取节点

13.3.7 通过Curator更新节点

13.3.8 通过Curator删除节点

13.4 分布式命名服务实战

13.4.1 ID生成器

13.4.2 ZooKeeper分布式ID生成器的实战案例

13.4.3 集群节点的命名服务的实战案例

13.4.4 结合ZooKeeper实现SnowFlake ID算法

13.5 分布式事件监听的重点

13.5.1 Watcher标准的事件处理器

13.5.2 NodeCache节点缓存的监听

13.5.3 PathCache子节点监听

13.5.4 TreeCache节点树缓存

13.6 分布式锁原理与实战

13.6.1 公平锁和可重入锁的原理

13.6.2 ZooKeeper分布式锁的原理

13.6.3 分布式锁的基本流程

13.6.4 加锁的实现

13.6.5 释放锁的实现

13.6.6 分布式锁的使用

13.6.7 Curator的InterProcessMutex可重入锁

13.6.8 ZooKeeper分布式锁的优缺点

第14章 分布式缓存Redis实战

14.1 Redis入门

14.1.1 Redis的安装和配置

14.1.2 Redis客户端命令

14.1.3 Redis键的命名规范

14.2 Redis数据类型

14.2.1 String

14.2.2 List

14.2.3 Hash

14.2.4 Set

14.2.5 ZSet

14.3 Jedis基础编程的实战案例

14.3.1 Jedis操作String

14.3.2 Jedis操作List

14.3.3 Jedis操作Hash

14.3.4 Jedis操作Set

14.3.5 Jedis操作ZSet

14.4 JedisPool连接池的实战案例

14.4.1 JedisPool的配置

14.4.2 JedisPool的创建和预热

14.4.3 JedisPool的使用

14.5 使用spring-data-redis完成CRUD的实战案例

14.5.1 CRUD中应用缓存的场景

14.5.2 配置spring-redis.xml

14.5.3 RedisTemplate模板API

14.5.4 使用RedisTemplate模板API完成CRUD的实战案例

14.5.5 使用RedisCallback回调完成CRUD的实战案例

14.6 Spring的Redis缓存注解

14.6.1 使用Spring缓存注解完成CRUD的实战案例

14.6.2 spring-redis.xml中配置的调整

14.6.3 @CachePut和@Cacheable注解

14.6.4 @CacheEvict注解

14.6.5 @Caching组合注解

14.7 详解SpEL

14.7.1 SpEL运算符

14.7.2 缓存注解中的SpEL表达式

第15章 亿级高并发IM架构与实战

15.1 支撑亿级流量的高并发IM架构的理论基础

15.1.1 亿级流量的系统架构的开发实战

15.1.2 高并发架构的技术选型

15.1.3 详解IM消息的序列化协议选型

15.1.4 详解长连接和短连接

15.2 分布式IM的命名服务的实战案例

15.2.1 IM节点的POJO类

15.2.2 IM节点的ImWorker类

15.3 Worker集群的负载均衡的实战案例

15.3.1 ImLoadBalance负载均衡器

15.3.2 与WebGate的整合

15.4 即时通信消息的路由和转发的实战案例

15.4.1 IM路由器WorkerRouter

15.4.2 IM转发器PeerSender

15.5 在线用户统计的实战案例

15.5.1 Curator的分布式计数器

15.5.2 用户上线和下线的统计

Java高并发核心编程 卷2:多线程、锁、JMM、JUC、高并发设计模式

版权信息

前言

本书内容

读者对象

本书源代码下载

勘误和支持

致谢

自序

第1章 多线程原理与实战

1.1 两个技术面试故事

1.2 无处不在的进程和线程

1.2.1 进程的基本原理

1.2.2 线程的基本原理

1.2.3 进程与线程的区别

1.3 创建线程的4种方法

1.3.1 Thread类详解

1.3.2 创建一个空线程

1.3.3 线程创建方法一:继承Thread类创建线程类

1.3.4 线程创建方法二:实现Runnable接口创建线程目标类

1.3.5 优雅创建Runnable线程目标类的两种方式

1.3.6 通过实现Runnable接口的方式创建线程目标类的优缺点

1.3.7 线程创建方法三:使用Callable和FutureTask创建线程

1.3.8 线程创建方法四:通过线程池创建线程

1.4 线程的核心原理

1.4.1 线程的调度与时间片

1.4.2 线程的优先级

1.4.3 线程的生命周期

1.4.4 一个线程状态的简单演示案例

1.4.5 使用Jstack工具查看线程状态

1.5 线程的基本操作

1.5.1 线程名称的设置和获取

1.5.2 线程的sleep操作

1.5.3 线程的interrupt操作

1.5.4 线程的join操作

1.5.5 线程的yield操作

1.5.6 线程的daemon操作

1.5.7 线程状态总结

1.6 线程池原理与实战

1.6.1 JUC的线程池架构

1.6.2 Executors的4种快捷创建线程池的方法

1.6.3 线程池的标准创建方式

1.6.4 向线程池提交任务的两种方式

1.6.5 线程池的任务调度流程

1.6.6 ThreadFactory(线程工厂)

1.6.7 任务阻塞队列

1.6.8 调度器的钩子方法

1.6.9 线程池的拒绝策略

1.6.10 线程池的优雅关闭

1.6.11 Executors快捷创建线程池的潜在问题

1.7 确定线程池的线程数

1.7.1 按照任务类型对线程池进行分类

1.7.2 为IO密集型任务确定线程数

1.7.3 为CPU密集型任务确定线程数

1.7.4 为混合型任务确定线程数

1.8 ThreadLocal原理与实战

1.8.1 ThreadLocal的基本使用

1.8.2 ThreadLocal的使用场景

1.8.3 使用ThreadLocal进行线程隔离

1.8.4 使用ThreadLocal进行跨函数数据传递

1.8.5 ThreadLocal内部结构演进

1.8.6 ThreadLocal源码分析

1.8.7 ThreadLocalMap源码分析

1.8.8 ThreadLocal综合使用案例

第2章 Java内置锁的核心原理

2.1 线程安全问题

2.1.1 自增运算不是线程安全的

2.1.2 临界区资源与临界区代码段

2.2 synchronized关键字

2.2.1 synchronized同步方法

2.2.2 synchronized同步块

2.2.3 静态的同步方法

2.3 生产者-消费者问题

2.3.1 生产者-消费者模式

2.3.2 一个线程不安全的实现版本

2.3.3 一个线程安全的实现版本

2.4 Java对象结构与内置锁

2.4.1 Java对象结构

2.4.2 Mark Word的结构信息

2.4.3 使用JOL工具查看对象的布局

2.4.4 大小端问题

2.4.5 无锁、偏向锁、轻量级锁和重量级锁

2.5 偏向锁的原理与实战

2.5.1 偏向锁的核心原理

2.5.2 偏向锁的演示案例

2.5.3 偏向锁的膨胀和撤销

2.6 轻量级锁的原理与实战

2.6.1 轻量级锁的核心原理

2.6.2 轻量级锁的演示案例

2.6.3 轻量级锁的分类

2.6.4 轻量级锁的膨胀

2.7 重量级锁的原理与实战

2.7.1 重量级锁的核心原理

2.7.2 重量级锁的开销

2.7.3 重量级锁的演示案例

2.8 偏向锁、轻量级锁与重量级锁的对比

2.9 线程间通信

2.9.1 线程间通信的定义

2.9.2 低效的线程轮询

2.9.3 wait方法和notify方法的原理

2.9.4 “等待-通知”通信模式演示案例

2.9.5 生产者-消费者之间的线程间通信

2.9.6 需要在synchronized同步块的内部使用wait和notify

第3章 CAS原理与JUC原子类

3.1 什么是CAS

3.1.1 Unsafe类中的CAS方法

3.1.2 使用CAS进行无锁编程

3.1.3 使用无锁编程实现轻量级安全自增

3.1.4 字段偏移量的计算

3.2 JUC原子类

3.2.1 JUC中的Atomic原子操作包

3.2.2 基础原子类AtomicInteger

3.2.3 数组原子类AtomicIntegerArray

3.2.4 AtomicInteger线程安全原理

3.3 对象操作的原子性

3.3.1 引用类型原子类

3.3.2 属性更新原子类

3.4 ABA问题

3.4.1 了解ABA问题

3.4.2 ABA问题解决方案

3.4.3 使用AtomicStampedReference解决ABA问题

3.4.4 使用AtomicMarkableReference解决ABA问题

3.5 提升高并发场景下CAS操作的性能

3.5.1 以空间换时间:LongAdder

3.5.2 LongAdder的原理

3.6 CAS在JDK中的广泛应用

3.6.1 CAS操作的弊端和规避措施

3.6.2 CAS操作在JDK中的应用

第4章 可见性与有序性的原理

4.1 CPU物理缓存结构

4.2 并发编程的三大问题

4.2.1 原子性问题

4.2.2 可见性问题

4.2.3 有序性问题

4.3 硬件层的MESI协议原理

4.3.1 总线锁和缓存锁

4.3.2 MSI协议

4.3.3 MESI协议及RFO请求

4.3.4 volatile的原理

4.4 有序性与内存屏障

4.4.1 重排序

4.4.2 As-if-Serial规则

4.4.3 硬件层面的内存屏障

4.5 JMM详解

4.5.1 什么是Java内存模型

4.5.2 JMM与JVM物理内存的区别

4.5.3 JMM的8个操作

4.5.4 JMM如何解决有序性问题

4.5.5 volatile语义中的内存屏障

4.6 Happens-Before规则

4.6.1 Happens-Before规则介绍

4.6.2 规则1:顺序性规则

4.6.3 规则2:volatile规则

4.6.4 规则3:传递性规则

4.6.5 规则4:监视锁规则

4.6.6 规则5:start()规则

4.6.7 规则6:join()规则

4.7 volatile不具备原子性

4.7.1 volatile变量的自增实例

4.7.2 volatile变量的复合操作不具备原子性的原理

第5章 JUC显式锁的原理与实战

5.1 显式锁

5.1.1 显式锁Lock接口

5.1.2 可重入锁ReentrantLock

5.1.3 使用显式锁的模板代码

5.1.4 基于显式锁进行“等待-通知”方式的线程间通信

5.1.5 LockSupport

5.1.6 显式锁的分类

5.2 悲观锁和乐观锁

5.2.1 悲观锁存在的问题

5.2.2 通过CAS实现乐观锁

5.2.3 不可重入的自旋锁

5.2.4 可重入的自旋锁

5.2.5 CAS可能导致“总线风暴”

5.2.6 CLH自旋锁

5.3 公平锁与非公平锁

5.3.1 非公平锁实战

5.3.2 公平锁实战

5.4 可中断锁与不可中断锁

5.4.1 锁的可中断抢占

5.4.2 死锁的监测与中断

5.5 共享锁与独占锁

5.5.1 独占锁

5.5.2 共享锁Semaphore

5.5.3 共享锁CountDownLatch

5.6 读写锁

5.6.1 读写锁ReentrantReadWriteLock

5.6.2 锁的升级与降级

5.6.3 StampedLock

第6章 AQS抽象同步器的核心原理

6.1 锁与队列的关系

6.2 AQS的核心成员

6.2.1 状态标志位

6.2.2 队列节点类

6.2.3 FIFO双向同步队列

6.2.4 JUC显式锁与AQS的关系

6.2.5 ReentrantLock与AQS的组合关系

6.3 AQS中的模板模式

6.3.1 模板模式

6.3.2 一个模板模式的参考实现

6.3.3 AQS的模板流程

6.3.4 AQS中的钩子方法

6.4 通过AQS实现一把简单的独占锁

6.4.1 简单的独占锁的UML类图

6.4.2 简单的独占锁的实现

6.4.3 SimpleMockLock测试用例

6.5 AQS锁抢占的原理

6.5.1 显式锁抢占的总体流程

6.5.2 AQS模板方法:acquire(arg)

6.5.3 钩子实现:tryAcquire(arg)

6.5.4 直接入队:addWaiter

6.5.5 自旋入队:enq

6.5.6 自旋抢占:acquireQueued()

6.5.7 挂起预判:shouldParkAfterFailedAcquire()

6.5.8 线程挂起:parkAndCheckInterrupt()

6.6 AQS的两个关键点:节点的入队和出队

6.6.1 节点的自旋入队

6.6.2 节点的出队

6.7 AQS锁释放的原理

6.7.1 SimpleMockLock独占锁的释放流程

6.7.2 AQS模板方法:release()

6.7.3 钩子实现:tryRelease()

6.7.4 唤醒后继:unparkSuccessor()

6.8 ReentrantLock的抢锁流程

6.8.1 ReentrantLock非公平锁的抢占流程

6.8.2 非公平锁的同步器子类

6.8.3 非公平抢占的钩子方法:tryAcquire(arg)

6.8.4 ReentrantLock公平锁的抢占流程

6.8.5 公平锁的同步器子类

6.8.6 公平抢占的钩子方法:tryAcquire(arg)

6.8.7 是否有后继节点的判断

6.9 AQS条件队列

6.9.1 Condition基本原理

6.9.2 await()等待方法原理

6.9.3 signal()唤醒方法原理

6.10 AQS的实际应用

第7章 JUC容器类

7.1 线程安全的同步容器类

7.2 JUC高并发容器

7.3 CopyOnWriteArrayList

7.3.1 CopyOnWriteArrayList的使用

7.3.2 CopyOnWriteArrayList的原理

7.3.3 CopyOnWriteArrayList读取操作

7.3.4 CopyOnWriteArrayList写入操作

7.3.5 CopyOnWriteArrayList的迭代器实现

7.4 BlockingQueue

7.4.1 BlockingQueue的特点

7.4.2 阻塞队列的常用方法

7.4.3 常见的BlockingQueue

7.4.4 ArrayBlockingQueue的基本使用

7.4.5 ArrayBlockingQueue构造器和成员

7.4.6 非阻塞式添加元素:add()、offer()方法的原理

7.4.7 阻塞式添加元素:put()方法的原理

7.4.8 非阻塞式删除元素:poll()方法的原理

7.4.9 阻塞式删除元素:take()方法的原理

7.4.10 peek()直接返回当前队列的头元素

7.5 ConcurrentHashMap

7.5.1 HashMap和HashTable的问题

7.5.2 JDK 1.7版本ConcurrentHashMap的结构

7.5.3 JDK 1.7版本ConcurrentHashMap的核心原理

7.5.4 JDK 1.8版本ConcurrentHashMap的结构

7.5.5 JDK 1.8版本ConcurrentHashMap的核心原理

7.5.6 JDK 1.8版本ConcurrentHashMap的核心源码

第8章 高并发设计模式

8.1 线程安全的单例模式

8.1.1 从饿汉式单例到懒汉式单例

8.1.2 使用内置锁保护懒汉式单例

8.1.3 双重检查锁单例模式

8.1.4 使用双重检查锁+volatile

8.1.5 使用静态内部类实现懒汉式单例模式

8.2 Master-Worker模式

8.2.1 Master-Worker模式的参考实现

8.2.2 Netty中Master-Worker模式的实现

8.2.3 Nginx中Master-Worker模式的实现

8.3 ForkJoin模式

8.3.1 ForkJoin模式的原理

8.3.2 ForkJoin框架

8.3.3 ForkJoin框架使用实战

8.3.4 ForkJoin框架的核心API

8.3.5 工作窃取算法

8.3.6 ForkJoin框架的原理

8.4 生产者-消费者模式

8.5 Future模式

第9章 高并发核心模式之异步回调模式

9.1 从泡茶的案例讲起

9.2 join:异步阻塞之闷葫芦

9.2.1 线程的合并流程

9.2.2 调用join()实现异步泡茶喝

9.2.3 join()方法详解

9.3 FutureTask:异步调用之重武器

9.3.1 通过FutureTask获取异步执行结果的步骤

9.3.2 使用FutureTask实现异步泡茶喝

9.4 异步回调与主动调用

9.5 Guava的异步回调模式

9.5.1 详解FutureCallback

9.5.2 详解ListenableFuture

9.5.3 ListenableFuture异步任务

9.5.4 使用Guava实现泡茶喝的实例

9.5.5 Guava异步回调和Java异步调用的区别

9.6 Netty的异步回调模式

9.6.1 GenericFutureListener接口详解

9.6.2 Netty的Future接口详解

9.6.3 ChannelFuture的使用

9.6.4 Netty的出站和入站异步回调

9.7 异步回调模式小结

第10章 CompletableFuture异步回调

10.1 CompletableFuture详解

10.1.1 CompletableFuture的UML类关系

10.1.2 CompletionStage接口

10.1.3 使用runAsync和supplyAsync创建子任务

10.1.4 设置子任务回调钩子

10.1.5 调用handle()方法统一处理异常和结果

10.1.6 线程池的使用

10.2 异步任务的串行执行

10.2.1 thenApply()方法

10.2.2 thenRun()方法

10.2.3 thenAccept()方法

10.2.4 thenCompose()方法

10.2.5 4个任务串行方法的区别

10.3 异步任务的合并执行

10.3.1 thenCombine()方法

10.3.2 runAfterBoth()方法

10.3.3 thenAcceptBoth()方法

10.3.4 allOf()等待所有的任务结束

10.4 异步任务的选择执行

10.4.1 applyToEither()方法

10.4.2 runAfterEither()方法

10.4.3 acceptEither()方法

10.5 CompletableFuture的综合案例

10.5.1 使用CompletableFuture实现泡茶喝实例

10.5.2 使用CompletableFuture进行多个RPC调用

10.5.3 使用RxJava模拟RPC异步回调

Java高并发核心编程(共二册)是2021年由机械工业出版社华章分社出版,作者尼恩。

得书感谢您对《Java高并发核心编程(共二册)》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

购买这本书

你可能喜欢
分布式系统设计实践 电子书
全面梳理分布式技术,详解原理及应用,研究大型系统案例。
Java面向对象程序开发及实战 电子书
大数据开发之路,带你进入面向对象编程世界。
Go语言高级编程 电子书
Go语言进阶实战,CGO编程web编程书。
Python编程轻松进阶 电子书
阅读本书,理解代码底层逻辑,像职业程序员一样使用Python。
持续交付2.0:业务引领的DevOps精要 电子书
世界级互联网公司软件交付工作原则与方法解析 作者在持续交付领域多年实践经验的精华总结 《持续交付:发布可靠软件的系统方法》作者作序推荐! 国内知名互联网公司多位管理者与领域专家合力倾情推荐! 持续交付2.0不只是关于软件的交付模型,而是从业务问题出发,关注业务假设验证速度的双环业务模型。只有从业务目标出发的持续交付实践才有强大的创造力和生命力! 书中指出,持续交付2.0双环模型高速运转的三个支柱分别是组织机制、软件架构和软件交付基础设施,同时给出了提升价值探索环以及快速验证环运转速度的多种可行方法。 本书还为我们呈现了在企业内部改善持续交付2.0能力所需遵循的基本原则,包括组织文化建设、软件系统架构、业务协作、配置管理、构建集成、自动化测试、发布与监控七大板块,并指出各领域实践关键点,以及多种可实操性方法。同时,通过3个完整的实践案例过程分析,说明每个企业或团队都必须从自己的业务目标出发,根据自己的实际情况,制定自己的改善路线。