并发编程理论与实践
作者:张杨著
出版时间:2019年版
内容简介
本书在Java编程语言的基础上,对并发编程的相关概念、基本原理、方法和技术进行了详细讲解,内容涉及线程同步和障栅、线程间通信、执行器、Fork/Join框架和并行流处理等内容。本书在讲解并发编程基本知识的同时,大量使用实例进行演示,力求做到内容透彻。本书内容先进翔实、知识结构合理、例题丰富、深入浅出,既适合作为普通高校和工程类院校学生学习高性能程序设计的教材,又适合作为IT领域人员学习Java并发编程技术的工具书,同时也可以作为那些需要掌握高性能计算技术的人员的自学参考用书。
目录
目录
第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.3Java并发方面的特性5
1.4并发/并行程序设计的方法6
1.4.1分治方法6
1.4.2流水线7
1.4.3消息传递8
1.5并发程序的评判标准8
1.6Java内存模型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.1join()方法33
2.4.2sleep()方法37
2.4.3yield()方法38
2.4.4interrupt()方法38
2.4.5其他方法40
2.5线程分组40
2.6线程数目的确定43
2.7线程本地化44
2.8带返回值的线程47
2.8.1Callable接口47
2.8.2Future接口47
2.8.3Callable与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.4volatile变量96
3.5原子操作96
3.5.1基本类型的原子类97
3.5.2一般引用类型的原子类100
3.5.3ABA问题102
3.5.4扩展的原子引用类型105
3.5.5原子操作数组类111
小结116
习题117第4章线程间通信118
4.1等待集合118
4.2wait()/notify()/notifyAll()方法118
4.2.1wait()方法118
4.2.2notify()方法119
4.2.3notifyAll()方法119
4.2.4实例120
4.3条件变量126
4.3.1await()方法127
4.3.2signal()方法128
4.3.3signalAll()方法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.1Executor接口161
6.1.2ExecutorService接口162
6.1.3ThreadPoolExecutor类162
6.1.4工厂类Executors163
6.1.5使用线程执行器处理没有返回值的线程164
6.2固定数目的线程执行器166
6.3使用线程执行器处理有返回值的线程168
6.4延迟执行、周期性执行的执行器171
6.4.1ScheduledExecutorService接口171
6.4.2ScheduledFuture接口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.3Fork/Join框架的编程模式185
7.4ForkJoinPool类186
7.4.1ForkJoinPool的创建186
7.4.2ForkJoinPool的使用187
7.5Fork/Join框架中的任务188
7.5.1任务的创建188
7.5.2任务的运行方式196
7.5.3任务的取消199
7.6Fork/Join框架的限制202
7.7几种线程机制的比较202
习题202第8章流处理203
8.1Lambda表达式203
8.1.1Lambda表达式的定义203
8.1.2Lambda表达式的使用204
8.2函数式接口Predicate205
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.1ForkJoinWorkerThread类221
9.5.2ForkJoinPool.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.2Java注释接口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