如何克服阅读经典源码的畏难情绪?如何将零散的 Java 高级知识串联为一个整体?如何将 Java 高级知识的学习与实践融为一体?阅读本书,你将获得想要的答案。本书向流畅阅读集高并发、高可用于一体的 ZooKeeper 源码的终极目标出发,从环境搭建开始点滴积累,提供了一种与众不同的 Java 语言学习路径。 本书首先讲解了源码阅读环境选型、必备插件准备、快捷操作高级技巧、源码跟踪调试高级技巧及常见问题分析,介绍了如何构建 ZooKeeper 源码及多个底层开源组件的源码阅读环境;其次完整地论述了字符集的基础知识,说明了字符乱码产生的原因及根本的解决办法;接着以装饰模式为核心构建一套新的I/O 学习方法,并结合源码深入分析了线程、线程池、ThreadFactory 和 ThreadLocal;然后以 JCStress 压测为辅助手段深入讲解 Java 内存模型,并深入分析了高并发常用编程组件;最后围绕案例讲解基于 BIO、NIO、AIO 的网络编程模型,以实战形式分析 RMI、WebService、RPC、HttpServer、HttpClient 等 JDK 内置组件。
沈进群,人民大学软件工程硕士,中级经济师,持有DBA证书。本书作者拥有超过20年的资深行业经验,专注于大型金融系统架构设计与研发管理,长期服务于银行、保险等国家级金融机构,深度参与多项亿级规模核心业务系统的战略级项目,近期研究方向为生成式AI,对大模型网络架构、预训练和微调等有比较深入的探索及实践。
第1章 打磨源码阅读环境
1.1 集成开发环境准备
1.1.1 Eclipse IDE安装与优化
1.1.2 IntelliJ IDEA社区版安装与优化
1.2 Eclipse开发环境高级设置
1.2.1 高效编程必备设置
1.2.2 全键盘操作修炼之道
1.3 IDEA快捷操作进阶
1.3.1 快捷操作之Live Templates
1.3.2 快捷操作之Postfix Completion
1.4 编码效率提升利器——Vrapper与IdeaVim速成
1.4.1 命令模式
1.4.2 文本编辑模式
1.4.3 尾行模式
1.5 JDK版本选型、安装和配置
1.5.1 版本选型——OpenJDK 11
1.5.2 Eclipse环境设置Java Module可访问性
1.5.3 IDEA中设置JDK Module可见性
1.6 本章小结
第2章 创建示例工程,开启源码调试研究
2.1 示例工程的设计原则
2.2 创建标准工作区——Eclipse
2.3 创建标准工作区——IntelliJ IDEA
2.4 源码跟踪及调试实用技巧——Eclipse
2.4.1 六种显式断点各尽其用
2.4.2 六种隐式断点深度揭秘
2.4.3 揭秘断点调试中的八大“灵异”事件
2.4.4 持续提升Debug技能
2.5 基于IntelliJ IDEA的源码跟踪及调试实用技巧
2.5.1 IDEA调试功能“平替”Eclipse
2.5.2 IDEA高阶调试技巧
2.5.3 调试侵入干扰程序功能和性能
2.6 本章小结
第3章 导入、编译与运行ZooKeeper源码
3.1 ZooKeeper 3.4.14源码阅读准备
3.1.1 ZooKeeper 3.4.14源码导入Eclipse
3.1.2 ZooKeeper 3.4.14源码导入IDEA
3.2 极速简易法开启ZK工程验证
3.2.1 ZK编译常见问题处理
3.2.2 突破源码阅读第一关
3.2.3 ZK服务端启动
3.2.4 ZK客户端启动连接
3.3 JDK 11源码解压缩及导入
3.4 Log4j源码阅读准备
3.4.1 源码搜索方法汇总
3.4.2 将日志组件源码导入到示例工程
3.4.3 补充导入循环依赖组件
3.5 SLF4J源码阅读准备
3.6 JUnit源码阅读准备
3.7 本章小结
第4章 根治中文乱码——Java字符集考证
4.1 常见字符集与字符编码辨识
4.1.1 ASCII码回顾
4.1.2 单字节拉丁字符集ISO-8859-1
4.1.3 双字节中文字符集GB2312
4.1.4 汉字扩展库GBK与CP936代码页
4.1.5 Windows操作系统中的ANSI
4.2 统一码(Unicode)
4.2.1 动手制作Unicode字典表
4.2.2 Unicode字符集知识体系
4.2.3 基于Unicode字符集的六大编码辨析
4.3 发掘Java端字符集控制的工具箱
4.3.1 JDK命令行工具与字符集控制参数
4.3.2 操作系统对字符集的影响
4.3.3 IDE中的字符编码设置
4.4 让乱码原地现形的组合拳
4.4.1 解决乱码的策略
4.4.2 字符集有损转换与无损转换实践
4.4.3 常见乱码典型特征识别
4.4.4 Java命令行参数解决乱码问题
4.4.5 IDE设置与乱码处置
4.4.6 通过代码转换解决乱码(String类)
4.4.7 操作系统侧修正乱码
4.5 字符集控制底层逻辑与JDK源码解读
4.5.1 UTF-16字符编码关联Character类
4.5.2 String类中的显式或隐式编码转换
4.5.3 所有字符集或编码的祖先——Charset类
4.5.4 Java序列化之DataOutputStream类
4.5.5 Java反序列化之DataInputStream类
4.5.6 属性文件处理与Properties类
4.5.7 标准输入、标准输出与System类
4.6 本章小结
第5章 摒弃死记硬背,全方位精通Java I/O体系
5.1 Java I/O迂回学习归纳总结
5.1.1 深扒Java I/O体系学习十大槽点
5.1.2 Java I/O学习的必要性
5.1.3 Java I/O学习范式
5.2 字节流基础应用及源码分析
5.2.1 向本地磁盘写Java对象
5.2.2 两种方式从本地磁盘获取文本内容
5.2.3 自定义输入流——按指定分隔符读取
5.2.4 字节输出流源码解读
5.2.5 字节输入流源码解读
5.3 节点流、过滤流与序列化的综合应用
5.3.1 八个原生数据类型的字节码输入输出
5.3.2 自定义原生数据类型可视化输出
5.3.3 Java对象的序列化与反序列化
5.3.4 回退流应用原理解析
5.4 字符流基础应用及源码分析
5.4.1 字符输入流的整行读取
5.4.2 从源码看字符流与字节流的关系
5.5 字符流与半个汉字读写问题
5.5.1 字符输出流对SMP文字的支持
5.5.2 用混编字符串考查字符输出流
5.6 从BIO到NIO的延伸阅读
5.6.1 NIO中的通道和缓冲区
5.6.2 自定义字节缓冲区MyByteBuffer
5.6.3 模拟Netty中的双向指针字节缓冲区
5.6.4 NIO中的性能优化
5.7 本章小结
第6章 盘点线程、线程状态与线程池
6.1 轻松入门多线程编程
6.1.1 三种线程初始化方法比较
6.1.2 返回式线程的回调与阻塞
6.1.3 源码解读之java.lang.Thread类
6.2 枚举全部线程状态,探究状态跳转规则
6.2.1 枚举线程运行时的六种状态
6.2.2 区分Thread类中的interrupt关键字
6.2.3 线程中断不能立即生效的例外情况
6.3 线程池与线程工厂应用
6.3.1 线程池中的单例多线程
6.3.2 静态变量无惧多线程干扰
6.3.3 带返回参数的线程池应用
6.3.4 ThreadFactory简单应用
6.4 线程本地对象与线程安全
6.4.1 ThreadLocal类应用实例
6.4.2 从源码再认识ThreadLocal
6.5 非侵入式多线程优化重构
6.6 本章小结
第7章 挖掘Java高并发支撑体系
7.1 线程安全基础之synchronized关键字
7.1.1 synchronized关键字锁定对象验证
7.1.2 线程通信与wait、notify和notifyAll
7.2 Java内存模型与高并发陷阱
7.2.1 JMM原子性检验及实现策略
7.2.2 JMM可见性验证及应对策略
7.2.3 用JCStress验证JMM的有序性
7.2.4 final关键字语义分析
7.3 ZK组件之高并发Lock应用
7.3.1 LockSupport功能演示
7.3.2 重入锁ReentrantLock详细解读
7.3.3 AQS底层的原子性与可见性
7.3.4 读写分离与ReentrantReadWriteLock
7.4 ZK组件之高并发同步工具应用
7.4.1 ZK应用之CountDownLatch
7.4.2 CountDownLatch源码解析
7.5 ZK组件之高性能List、Set和Map
7.5.1 ArrayList线程不安全分析
7.5.2 线程安全的List实现及Vector类解析
7.5.3 读多写少之CopyOnWriteArrayList
7.6 ZK组件之高并发Queue应用
7.6.1 单锁数组队列ArrayBlockingQueue
7.6.2 双锁链表队列LinkedBlockingQueue
7.6.3 无锁无界队列ConcurrentLinkedQueue
7.7 本章小结
第8章 探索网络原理与网络应用的边界
8.1 阻塞式网络编程模型
8.1.1 Java阻塞式网络编程
8.1.2 基于BIO的双向简易聊天室实现
8.1.3 基于NIO的阻塞式网络编程模型
8.2 非阻塞、多路复用和异步网络编程模型
8.2.1 基于NIO的非阻塞式网络编程模型
8.2.2 基于Selector的多路复用网络编程模型
8.2.3 基于AIO的异步网络编程模型
8.3 JDK内置网络组件应用
8.3.1 远程方法调用(RMI)
8.3.2 WebService远程调用
8.3.3 远程过程调用(RPC)
8.3.4 JDK内置HTTP协议支持
8.4 ZK组件之网络应用
8.4.1 Netty模式应用
8.4.2 ZK工程中的NIO模式应用分析
8.4.3 ZK工程中Netty应用分析
8.4.4 粘包拆包问题处理
8.5 本章小结