全书内容由浅入深,共分为四个部分。第一部分介绍了Java并发编程的基础理论,包括线程安全性与状态对象的基础知识,如何构造线程安全的类并将多个小型的线程安全类构建成更大型的线程安全类,以及Java平台库中的一些基础并发模块;第二部分介绍了并发应用程序的构造理论,包括应用程序中并行语义的分解及其与逻辑任务的映射,任务的取消与关闭等行为的实现,以及Java线程池中的一些高级功能,此外还介绍了如何提高GUI应用程序的响应性;第三部分介绍了并发编程的性能调优,包括如何避免活跃性问题,如何提高并发代码的性能和可伸缩性以获得理想的性能,以及在测试并发代码正确性和性能时的一些实用技术;第四部分介绍了Java并发编程中的一些高级主题,包括显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类等。
封面图
目录
- 前言
- 第1章并发编程的挑战1
- 1.1上下文切换1
- 1.1.1多线程一定快吗1
- 1.1.2测试上下文切换次数和时长3
- 1.1.3如何减少上下文切换3
- 1.1.4减少上下文切换实战4
- 1.2死锁5
- 1.3资源限制的挑战6
- 1.4本章小结7
- 第2章Java并发机制的底层实现原理8
- 2.1volatile的应用8
- 2.2synchronized的实现原理与应用11
- 2.2.1Java对象头12
- 2.2.2锁的升级与对比13
- 2.3原子操作的实现原理16
- 2.4本章小结20
- 第3章Java内存模型21
- 3.1Java内存模型的基础21
- 3.1.1并发编程模型的两个关键问题21
- 3.1.2Java内存模型的抽象结构22
- 3.1.3从源代码到指令序列的重排序23
- 3.1.4并发编程模型的分类24
- 3.1.5happens-before简介26
- 3.2重排序27
- 3.2.1数据依赖性28
- 3.2.2as-if-serial语义28
- 3.2.3程序顺序规则29
- 3.2.4重排序对多线程的影响29
- 3.3顺序一致性31
- 3.3.1数据竞争与顺序一致性31
- 3.3.2顺序一致性内存模型32
- 3.3.3同步程序的顺序一致性效果34
- 3.3.4未同步程序的执行特性35
- 3.4volatile的内存语义38
- 3.4.1volatile的特性38
- 3.4.2volatile写-读建立的happens-before关系39
- 3.4.3volatile写-读的内存语义40
- 3.4.4volatile内存语义的实现42
- 3.4.5JSR-133为什么要增强volatile的内存语义46
- 3.5锁的内存语义47
- 3.5.1锁的释放-获取建立的
- happens-before关系47
- 3.5.2锁的释放和获取的内存语义48
- 3.5.3锁内存语义的实现50
- 3.5.4concurrent包的实现54
- 3.6final域的内存语义55
- 3.6.1final域的重排序规则55
- 3.6.2写final域的重排序规则56
- 3.6.3读final域的重排序规则57
- 3.6.4final域为引用类型58
- 3.6.5为什么final引用不能从构造函数内“溢出”59
- 3.6.6final语义在处理器中的实现61
- 3.6.7JSR-133为什么要增强f inal的语义62
- 3.7happens-before62
- 3.7.1JMM的设计62
- 3.7.2happens-before的定义64
- 3.7.3happens-before规则65
- 3.8双重检查锁定与延迟初始化67
- 3.8.1双重检查锁定的由来67
- 3.8.2问题的根源69
- 3.8.3基于volatile的解决方案71
- 3.8.4基于类初始化的解决方案72
- 3.9Java内存模型综述78
- 3.9.1处理器的内存模型78
- 3.9.2各种内存模型之间的关系80
- 3.9.3JMM的内存可见性保证80
- 3.9.4JSR-133对旧内存模型的修补81
- 3.10本章小结82
- 第4章Java并发编程基础83
- 4.1线程简介83
- 4.1.1什么是线程83
- 4.1.2为什么要使用多线程84
- 4.1.3线程优先级85
- 4.1.4线程的状态87
- 4.1.5Daemon线程90
- 4.2启动和终止线程91
- 4.2.1构造线程91
- 4.2.2启动线程92
- 4.2.3理解中断92
- 4.2.4过期的suspend()、resume()和stop()93
- 4.2.5安全地终止线程95
- 4.3线程间通信96
- 4.3.1volatile和synchronized关键字96
- 4.3.2等待/通知机制98
- 4.3.3等待/通知的经典范式101
- 4.3.4管道输入/输出流102
- 4.3.5Thread.join()的使用103
- 4.3.6ThreadLocal的使用105
- 4.4线程应用实例106
- 4.4.1等待超时模式106
- 4.4.2一个简单的数据库连接池示例106
- 4.4.3线程池技术及其示例110
- 4.4.4一个基于线程池技术的简单Web服务器114
- 4.5本章小结118
- 第5章Java中的锁119
- 5.1Lock接口119
- 5.2队列同步器121
- 5.2.1队列同步器的接口与示例121
- 5.2.2队列同步器的实现分析124
- 5.3重入锁136
- 5.4读写锁140
- 5.4.1读写锁的接口与示例141
- 5.4.2读写锁的实现分析142
- 5.5LockSupport工具146
- 5.6Condition接口147
- 5.6.1Condition接口与示例148
- 5.6.2Condition的实现分析150
- 5.7本章小结154
- 第6章Java并发容器和框架155
- 6.1ConcurrentHashMap的实现原理与使用155
- 6.1.1为什么要使用ConcurrentHashMap155
- 6.1.2ConcurrentHashMap的结构156
- 6.1.3ConcurrentHashMap的初始化157
- 6.1.4定位Segment159
- 6.1.5ConcurrentHashMap的操作160
- 6.2ConcurrentLinkedQueue161
- 6.2.1ConcurrentLinkedQueue的结构162
- 6.2.2入队列162
- 6.2.3出队列165
- 6.3Java中的阻塞队列167
- 6.3.1什么是阻塞队列167
- 6.3.2Java里的阻塞队列168
- 6.3.3阻塞队列的实现原理172
- 6.4Fork/Join框架175
- 6.4.1什么是Fork/Join框架175
- 6.4.2工作窃取算法176
- 6.4.3Fork/Join框架的设计177
- 6.4.4使用Fork/Join框架177
- 6.4.5Fork/Join框架的异常处理179
- 6.4.6Fork/Join框架的实现原理179
- 6.5本章小结181
- 第7章Java中的13个原子操作类182
- 7.1原子更新基本类型类182
- 7.2原子更新数组184
- 7.3原子更新引用类型185
- 7.4原子更新字段类187
- 7.5本章小结188
- 第8章Java中的并发工具类189
- 8.1等待多线程完成的CountDownLatch189
- 8.2同步屏障CyclicBarrier191
- 8.2.1CyclicBarrier简介191
- 8.2.2CyclicBarrier的应用场景193
- 8.2.3CyclicBarrier和CountDownLatch的区别195
- 8.3控制并发线程数的Semaphore196
- 8.4线程间交换数据的Exchanger198
- 8.5本章小结199
- 第9章Java中的线程池200
- 9.1线程池的实现原理200
- 9.2线程池的使用203
- 9.2.1线程池的创建203
- 9.2.2向线程池提交任务205
- 9.2.3关闭线程池205
- 9.2.4合理地配置线程池206
- 9.2.5线程池的监控206
- 9.3本章小结207
- 第10章Executor框架208
- 10.1Executor框架简介208
- 10.1.1Executor框架的两级调度模型208
- 10.1.2Executor框架的结构与成员208
- 10.2ThreadPoolExecutor详解213
- 10.2.1FixedThreadPool详解213
- 10.2.2SingleThreadExecutor详解214
- 10.2.3CachedThreadPool详解215
- 10.3ScheduledThreadPoolExecutor详解217
- 10.3.1ScheduledThreadPoolExecutor的运行机制217
- 10.3.2ScheduledThreadPoolExecutor的实现218
- 10.4FutureTask详解221
- 10.4.1FutureTask简介222
- 10.4.2FutureTask的使用222
- 10.4.3FutureTask的实现224
- 10.5本章小结227
- 第11章Java并发编程实践228
- 11.1生产者和消费者模式228
- 11.1.1生产者消费者模式实战229
- 11.1.2多生产者和多消费者场景231
- 11.1.3线程池与生产消费者模式234
- 11.2线上问题定位234
- 11.3性能测试236
- 11.4异步任务池238
- 11.5本章小结240