第1章 引言 1
1.1 共享对象和同步 2
1.2 生活实例 4
1.2.1 互斥特性 6
1.2.2 道德 7
1.3 生产者-消费者问题 7
1.4 读者-写者问题 9
1.5 并行的困境 9
1.6 并行程序设计 11
1.7 本章注释 11
1.8 习题 11
第一部分 原 理 14
第2章 互斥 14
2.1 时间 14
2.2 临界区 14
2.3 双线程解决方案 16
2.3.1 LockOne类 16
2.3.2 LockTwo类 17
2.3.3 Peterson锁 18
2.4 过滤锁 19
2.5 公平性 21
2.6 Bakery算法 21
2.7 有界时间戳 23
2.8 存储单元数量的下界 25
2.9 本章注释 27
2.10 习题 28
第3章 并发对象 31
3.1 并发性与正确性 31
3.2 顺序对象 33
3.3 静态一致性 34
3.4 顺序一致性 35
3.5 可线性化性 38
3.5.1 可线性化点 38
3.5.2 评析 38
3.6 形式化定义 38
3.6.1 可线性化性 39
3.6.2 可线性化性的复合性 40
3.6.3 非阻塞特性 40
3.7 演进条件 41
3.8 Java存储器模型 43
3.8.1 锁和同步块 44
3.8.2 volatile域 44
3.8.3 final域 44
3.9 评析 45
3.10 本章注释 46
3.11 习题 46
第4章 共享存储器基础 50
4.1 寄存器空间 50
4.2 寄存器构造 54
4.2.1 MRSW安全寄存器 55
4.2.2 MRSW规则布尔寄存器 55
4.2.3 M-值MRSW规则寄存器 56
4.2.4 SRSW原子寄存器 57
4.2.5 MRSW原子寄存器 59
4.2.6 MRMW原子寄存器 60
4.3 原子快照 62
4.3.1 无障碍快照 63
4.3.2 无等待快照 64
4.3.3 正确性证明 66
4.4 本章注释 67
4.5 习题 67
第5章 同步原子操作的相对能力 70
5.1 一致数 70
5.2 原子寄存器 72
5.3 一致性协议 74
5.4 FIFO队列 74
5.5 多重赋值对象 77
5.6 读-改-写操作 79
5.7 Common2 RMW操作 80
5.8 compareAndSet()操作 81
5.9 本章注释 82
5.10 习题 83
第6章 一致性的通用性 87
6.1 引言 87
6.2 通用性 88
6.3 一种通用的无锁构造 88
6.4 一种通用的无等待构造 91
6.5 本章注释 95
6.6 习题 95
第二部 分实 践 98
第7章 自旋锁与争用 98
7.1 实际问题 98
7.2 测试-设置锁 100
7.3 再论基于TAS的自旋锁 102
7.4 指数后退 102
7.5 队列锁 104
7.5.1 基于数组的锁 104
7.5.2 CLH队列锁 106
7.5.3 MCS队列锁 107
7.6 时限队列锁 110
7.7 复合锁 112
7.8 层次锁 118
7.8.1 层次后退锁 118
7.8.2 层次CLH队列锁 119
7.9 由一个锁管理所有的锁 123
7.10 本章注释 123
7.11 习题 124
第8章 管程和阻塞同步 126
8.1 引言 126
8.2 管程锁和条件 126
8.2.1 条件 127
8.2.2 唤醒丢失问题 130
8.3 读者-写者锁 131
8.3.1 简单的读者-写者锁 131
8.3.2 公平的读者-写者锁 132
8.4 我们的可重入锁 134
8.5 信号量 135
8.6 本章注释 136
8.7 习题 136
第9章 链表:锁的作用 139
9.1 引言 139
9.2 基于链表的集合 140
9.3 并发推理 141
9.4 粗粒度同步 142
9.5 细粒度同步 143
9.6 乐观同步 146
9.7 惰性同步 149
9.8 非阻塞同步 153
9.9 讨论 157
9.10 本章注释 157
9.11 习题 158
第10章 并行队列和ABA问题 159
10.1 引言 159
10.2 队列 160
10.3 部分有界队列 160
10.4 完全无界队列 163
10.5 无锁的无界队列 164
10.6 内存回收和ABA问题 166
10.7 双重数据结构 170
10.8 本章注释 172
10.9 习题 172
第11章 并发栈和消除 174
11.1 引言 174
11.2 无锁的无界栈 174
11.3 消除 176
11.4 后退消除栈 176
11.4.1 无锁交换机 177
11.4.2 消除数组 179
11.5 本章注释 181
11.6 习题 181
第12章 计数、排序和分布式协作 184
12.1 引言 184
12.2 共享计数 184
12.3 软件组合 185
12.3.1 概述 185
12.3.2 一个扩展实例 190
12.3.3 性能和健壮性 191
12.4 静态一致池和计数器 192
12.5 计数网 192
12.5.1 可计数网 193
12.5.2 双调计数网 194
12.5.3 性能和流水线 201
12.6 衍射树 201
12.7 并行排序 204
12.8 排序网 204
12.9 样本排序 207
12.10 分布式协作 208
12.11 本章注释 208
12.12 习题 209
第13章 并发哈希和固有并行 212
13.1 引言 212
13.2 封闭地址哈希集 213
13.2.1 粗粒度哈希集 214
13.2.2 空间分带哈希集 215
13.2.3 细粒度哈希集 217
13.3 无锁哈希集 219
13.3.1 递归有序划分 219
13.3.2 BucketList类 222
13.3.3 LockFree HashSet〈T〉类 223
13.4 开放地址哈希集 225
13.4.1 Cuckoo哈希 225
13.4.2 并发Cuckoo哈希 226
13.4.3 空间分带的并发Cuckoo哈希 230
13.4.4 细粒度的并发Cuckoo哈希集 231
13.5 本章注释 233
13.6 习题 234
第14章 跳表和平衡查找 235
14.1 引言 235
14.2 顺序跳表 235
14.3 基于锁的并发跳表 236
14.3.1 简介 236
14.3.2 算法 238
14.4 无锁并发跳表 243
14.4.1 简介 243
14.4.2 算法细节 245
14.5 并发跳表 251
14.6 本章注释 251
14.7 习题 251
第15章 优先级队列 253
15.1 引言 253
15.2 基于数组的有界优先级队列 253
15.3 基于树的有界优先级队列 254
15.4 基于堆的无界优先级队列 256
15.4.1 顺序堆 256
15.4.2 并发堆 258
15.5 基于跳表的无界优先级队列 262
15.6 本章注释 264
15.7 习题 265
第16章 异步执行、调度和工作分配 266
16.1 引言 266
16.2 并行分析 271
16.3 多处理器的实际调度 273
16.4 工作分配 274
16.4.1 工作窃取 275
16.4.2 屈从和多道程序设计 275
16.5 工作窃取双端队列 276
16.5.1 有界工作窃取双端队列 276
16.5.2 无界工作窃取双端队列 279
16.5.3 工作平衡 282
16.6 本章注释 283
16.7 习题 284
第17章 障碍 287
17.1 引言 287
17.2 障碍实现 288
17.3 语义换向障碍 288
17.4 组合树障碍 289
17.5 静态树障碍 291
17.6 终止检测障碍 293
17.7 本章注释 295
17.8 习题 296
第18章 事务内存 302
18.1 引言 302
18.1.1 关于锁的问题 302
18.1.2 关于compareAndSet()的问题 303
18.1.3 关于复合性的问题 304
18.1.4 我们能做什么 305
18.2 事务和原子性 305
18.3 软事务内存 306
18.3.1 事务和事务线程 309
18.3.2 僵尸事务和一致性 310
18.3.3 原子对象 311
18.3.4 如何演进 311
18.3.5 争用管理器 312
18.3.6 原子对象的实现 314
18.3.7 无干扰原子对象 315
18.3.8 基于锁的原子对象 318
18.4 硬事务内存 323
18.4.1 缓存一致性 324
18.4.2 事务缓存一致性 324
18.4.3 改进 325
18.5 本章注释 325
18.6 习题 326
第三部分 附 录 328
附录A 软件基础 328
附录B 硬件基础 340
参考文献 350
索引 359