第1章 绪论 1
1.1 概述 1
1.2 相关概念和术语 2
1.2.1 并发与并行 2
1.2.2 串行执行和顺序执行 4
1.2.3 线程安全与线程不安全 4
1.2.4 数据竞争 5
1.2.5 超线程 5
1.2.6 加速比 6
1.3 Java并发方面的特性 7
1.4 并发程序设计的方法 8
1.4.1 分治方法 8
1.4.2 流水线 8
1.4.3 消息传递 9
1.5 并行程序的评判标准 9
1.6 程序运行的相关问题说明 10
习题 11
第2章 线程 12
2.1 什么是线程 12
2.2 线程的状态 13
2.2.1 创建 13
2.2.2 就绪 13
2.2.3 运行 14
2.2.4 阻塞 14
2.2.5 终止 14
2.3 线程的创建 15
2.3.1 继承类Thread 15
2.3.2 实现Runnable接口 16
2.3.3 两种方法的比较 18
2.4 线程的属性 18
2.4.1 线程标识符 18
2.4.2 线程名 20
2.4.3 线程的优先级和调度 23
2.4.4 线程状态 26
2.4.5 守护线程 28
2.5 线程管理 31
2.5.1 join方法 32
2.5.2 sleep方法 35
2.5.3 yield方法 36
2.5.4 线程的中断 36
2.5.5 其他 38
2.6 线程分组 38
2.7 带返回值的线程 41
2.7.1 接口Callable 41
2.7.2 接口Future 41
2.7.3 Callable与Runnable的比较 45
习题 45
第3章 线程同步 46
3.1 概述 46
3.2 基本概念 48
3.2.1 临界区 48
3.2.2 监视器 49
3.2.3 阻塞和非阻塞 49
3.3 锁 49
3.3.1 同步锁 50
3.3.2 可重入锁 52
3.3.3 读写锁 60
3.3.4 三种锁机制的比较 66
3.3.5 锁的不足之处 66
3.4 volatile变量 67
3.5 原子操作 68
3.5.1 AtomicInteger 68
3.5.2 AtomicReference 71
3.5.3 其他 73
3.6 死锁和活锁 73
3.6.1 死锁 73
3.6.2 活锁 76
3.7 多核时代减少锁竞争的方法 78
习题 79
第4章 线程间通信 80
4.1 等待集合 80
4.2 wait、notify、notifyAll方法 80
4.2.1 方法wait 80
4.2.2 方法notify 81
4.2.3 方法notifyAll 81
4.2.4 实例 81
4.3 条件变量 88
4.3.1 方法await 89
4.3.2 方法signal 89
4.3.3 方法signalAll 89
4.3.4 实例 90
习题 93
第5章 线程同步障栅 94
5.1 障栅 94
5.2 倒计时门闩 99
5.3 信号量 102
5.4 同步队列 107
5.5 交换器 110
5.6 阶段化处理 114
习题 123
第6章 线程执行器 124
6.1 线程池 124
6.1.1 接口Executor 125
6.1.2 接口ExecutorService 125
6.1.3 类ThreadPoolExecutor 125
6.1.4 工厂类Executors 126
6.1.5 使用线程执行器处理无返回值的线程 127
6.2 固定数目的线程执行器 129
6.3 使用线程执行器处理有返回值的线程 131
6.4 延迟执行、周期性执行的执行器 134
6.4.1 接口ScheduledExecutorService 134
6.4.2 接口ScheduledFuture 135
6.4.3 举例 135
6.5 取消任务的执行 138
6.6 任务装载和结果处理的分离 140
6.7 管理被拒绝的任务 142
第7章 Fork/Join框架 145
7.1 概述 145
7.2 相关知识 146
7.2.1 负载均衡 146
7.2.2 分治方法 146
7.2.3 工作窃取算法 147
7.3 Fork/Join框架的编程模式 147
7.4 类ForkJoinPool 148
7.4.1 ForkJoinPool的创建 148
7.4.2 ForJoinPool的使用 149
7.5 任务 150
7.5.1 任务的创建 150
7.5.2 任务的运行方式 158
7.5.3 任务的取消 160
7.6 Fork/Join框架的限制 164
习题 164
第8章 自定义并发类 165
8.1 自定义线程工厂 165
8.2 自定义线程池 167
8.3 在执行器中使用自定义的线程工厂 169
8.4 自定义周期性任务 171
8.5 自定义与Fork/Join框架相关的并发类 175
8.5.1 类ForkJoinWorkerThread 175
8.5.2 接口ForkJoinPool.ForkJoinWorkerThreadFactory 176
8.5.3 自定义Fork/Join框架中的线程 176
8.5.4 自定义任务 179
8.6 自定义同步类 181
8.6.1 自定义锁 182
8.6.2 自定义原子操作 185
习题 187
第9章 线程安全的集合 188
9.1 线程安全的双端队列 188
9.2 线程安全的哈希表 192
9.3 线程安全的跳表 194
9.4 随机数产生 196
第10章 多线程程序的性能和测试 198
10.1 性能 198
10.2 可伸缩性 200
10.3 多线程程序的测试 200
第11章 面向方面编程在并行程序设计中的应用 201
11.1 面向方面编程相关知识简介 201
11.1.1 关注点的分离 201
11.1.2 方面 201
11.1.3 切点 202
11.1.4 通知 202
11.1.5 AspectJ工具 202
11.2 Java注释接口 204
11.3 应用示例 205
习题 207