第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.3 Java并发方面的特性 5
1.4 并发卐并行程序设计的方法 6
1.4.1 分治方法 6
1.4.2 流水线 7
1.4.3 消息传递 8
1.5 并发程序的评判标准 8
1.6 Java内存模型 9
1.7 程序的运行说明 10
第2章 线程 13
2.1 进程与线程 13
2.2 线程的创建 14
2.2.1 继承Thread类 14
2.2.2 实现Runnable接口 16
2.2.3 两种方法的比较 18
2.2.4 相关说明 18
2.3 线程的属性 18
2.3.1 线程标识符 18
2.3.2 线程名 20
2.3.3 线程状态 23
2.3.4 线程的优先级和调度 27
2.3.5 守护线程 30
2.4 线程管理 33
2.4.1 join()方法 33
2.4.2 sleep()方法 37
2.4.3 yield()方法 38
2.4.4 interrupt()方法 38
2.4.5 其他方法 40
2.5 线程分组 40
2.6 线程数目的确定 43
2.7 线程本地化 44
2.8 带返回值的线程 47
2.8.1 Callable接口 47
2.8.2 Future接口 47
2.8.3 Callable与Runnable的比较 50
2.9 案例分析 51
小结 61
习题 61
第3章 线程同步控制 62
3.1 为什么要使用同步控制 62
3.2 基本概念 64
3.2.1 数据竞争 64
3.2.2 临界区 65
3.2.3 监视器 65
3.2.4 阻塞和非阻塞 66
3.2.5 线程安全与线程不安全 66
3.3 锁 67
3.3.1 同步锁 67
3.3.2 可重入锁 70
3.3.3 读写锁 77
3.3.4 邮戳锁 83
3.3.5 几种锁机制的比较 89
3.3.6 锁的不足之处 90
3.3.7 减少锁竞争的方法 90
3.3.8 死锁和活锁 91
3.4 volatile变量 96
3.5 原子操作 96
3.5.1 基本类型的原子类 97
3.5.2 一般引用类型的原子类 100
3.5.3 ABA问题 102
3.5.4 扩展的原子引用类型 105
3.5.5 原子操作数组类 111
小结 116
习题 117
第4章 线程间通信 118
4.1 等待集合 118
4.2 wait()巭notify()巭notifyAll()方法 118
4.2.1 wait()方法 118
4.2.2 notify()方法 119
4.2.3 notifyAll()方法 119
4.2.4 实例 120
4.3 条件变量 126
4.3.1 await()方法 127
4.3.2 signal()方法 128
4.3.3 signalAll()方法 128
4.3.4 实例 128
习题 131
第5章 线程同步障栅 132
5.1 障栅 132
5.2 倒计时门闩 137
5.3 信号量 140
5.4 同步队列 145
5.5 交换器 148
5.6 阶段化处理 152
习题 160
第6章 线程执行器 161
6.1 线程池 161
6.1.1 Executor接口 161
6.1.2 ExecutorService接口 162
6.1.3 ThreadPoolExecutor类 162
6.1.4 工厂类Executors 163
6.1.5 使用线程执行器处理没有返回值的线程 164
6.2 固定数目的线程执行器 166
6.3 使用线程执行器处理有返回值的线程 168
6.4 延迟执行、周期性执行的执行器 171
6.4.1 ScheduledExecutorService接口 171
6.4.2 ScheduledFuture接口 172
6.4.3 举例 173
6.5 取消任务的执行 176
6.6 任务装载和结果处理的分离 177
6.7 管理被拒绝的任务 179
第7章 Fork巭Join框架 183
7.1 概述 183
7.2 相关知识 184
7.2.1 负载均衡 184
7.2.2 分治方法 184
7.2.3 工作窃取算法 185
7.3 Fork巭Join框架的编程模式 185
7.4 ForkJoinPool类 186
7.4.1 ForkJoinPool的创建 186
7.4.2 ForkJoinPool的使用 187
7.5 Fork巭Join框架中的任务 188
7.5.1 任务的创建 188
7.5.2 任务的运行方式 196
7.5.3 任务的取消 199
7.6 Fork巭Join框架的限制 202
7.7 几种线程机制的比较 202
习题 202
第8章 流处理 203
8.1 Lambda表达式 203
8.1.1 Lambda表达式的定义 203
8.1.2 Lambda表达式的使用 204
8.2 函数式接口Predicate 205
8.3 流 206
8.3.1 流简介 206
8.3.2 创建流 207
8.3.3 流的操作 208
第9章 自定义并发类 211
9.1 自定义线程工厂 211
9.2 自定义线程池 213
9.3 在执行器中使用自定义的线程工厂 215
9.4 自定义周期性任务 216
9.5 自定义与Fork巭Join框架相关的并发类 221
9.5.1 ForkJoinWorkerThread类 221
9.5.2 ForkJoinPool.ForkJoinWorkerThreadFactory接口 221
9.5.3 自定义Fork巭Join框架中的线程 222
9.5.4 自定义任务 224
9.6 自定义同步类 227
9.6.1 自定义锁 227
9.6.2 自定义原子操作 231
习题 233
第10章 线程安全的集合 234
10.1 线程安全的双端队列 234
10.2 线程安全的哈希表 238
10.3 线程安全的跳表 240
10.4 随机数产生 242
10.5 并行数组 244
第11章 多线程程序的性能和测试 246
11.1 性能 246
11.2 可伸缩性 248
11.3 多线程程序的测试 248
第12章 面向切面技术在并发编程中的应用 249
12.1 相关知识 249
12.1.1 面向切面编程 249
12.1.2 Java注释接口 251
12.2 类方法的并发执行 254
12.2.1 问题的提出 254
12.2.2 并行库 255
12.2.3 基于面向方面技术的并行库易用性优化 260
12.2.4 实验 262
12.2.5 小结 266
12.3 实现被标记的类方法的并发执行 267
12.4 使用面向切面技术分离并发关注点 269
12.4.1 问题演示 269
12.4.2 重构框架 271
12.4.3 实验评估 274
习题 277