第1章  多线程基础	1
1.1  进程与线程	1
1.1.1  操作系统与进程	1
1.1.2  线程与进程的关系	2
1.2  多线程启动	3
1.2.1  线程标识	5
1.2.2  Thread与Runnable	6
1.2.3  run()与start()	7
1.2.4  Thread源码分析	9
1.3  线程状态	11
1.3.1  NEW状态	11
1.3.2  RUNNABLE状态	12
1.3.3  BLOCKED状态	13
1.3.4  WAITING状态	14
1.3.5  TIMED_WAITING状态	19
1.3.6  WAITING与BLOCKED的区别	21
1.3.7  TERMINATED状态	21
1.3.8  线程状态转换	22
1.4  sleep()与yield()	22
1.4.1  线程休眠sleep()	22
1.4.2  线程让步yield()	24
1.5  线程优先级	25
1.5.1  线程优先级与资源竞争	26
1.5.2  案例:大型浮点运算测试	26
1.5.3  案例:多线程售票	28
1.6  守护线程	30
1.6.1  守护线程的概念	30
1.6.2  案例:清道夫与工作者	31
1.7  本章习题	34
第2章  线程安全与共享资源竞争	37
2.1  synchronized同步介绍	37
2.2  synchronized同步方法	38
2.2.1  同步方法调用流程	41
2.2.2  同步方法之间的互斥	41
2.2.3  同步方法与非同步方法	44
2.3  synchronized同步静态方法	46
2.3.1  单例高并发问题	46
2.3.2  类锁与对象锁	47
2.3.3  静态同步方法之间互斥	47
2.3.4  静态同步方法与静态非同步方法	49
2.4  synchronized同步代码块	50
2.4.1  锁当前对象	50
2.4.2  锁其他对象	51
2.4.3  锁Class	51
2.5  项目案例:火车售票	52
2.5.1  共享任务模式	52
2.5.2  多任务模式	55
2.5.3  共享车票资源	56
2.6  项目案例:家庭消费	59
2.7  项目案例:别墅Party	63
2.7.1  无锁模式	63
2.7.2  单锁模式	66
2.7.3  双锁模式	67
2.8  JDK常见类的线程安全性	69
2.8.1  集合ArrayList与Vector	69
2.8.2  StringBuffer与StringBuilder	71
2.8.3  HashMap与ConcurrentHashMap	72
2.9  本章习题	73
第3章  多线程通信	76
3.1  wait()与notify()	76
3.1.1  阻塞当前线程	76
3.1.2  案例分析:厨师与侍者1	78
3.1.3  案例分析:厨师与侍者2	81
3.1.4  案例分析:两个线程交替输出信息	85
3.2  join线程排队	87
3.2.1  加入者与休眠者	87
3.2.2  案例:紧急任务处理	89
3.2.3  join限时阻塞	91
3.3  线程中断	93
3.3.1  中断运行态线程	93
3.3.2  中断阻塞态线程	95
3.3.3  如何停止线程	97
3.4  CountDownLatch计数器	98
3.5  CyclicBarrier屏障	100
3.5.1  案例:矩阵分行处理	101
3.5.2  案例:赛马游戏	103
3.6  Exchanger	104
3.7  Semaphore信号灯	107
3.8  死锁	108
3.8.1  案例:银行转账引发死锁	109
3.8.2  案例:哲学家就餐死锁	112
3.9  本章习题	115
第4章  线程池入门	117
4.1  ThreadPoolExecutor	117
4.1.1  创建线程池	118
4.1.2  关闭线程池	121
4.2  Executor接口	123
4.3  ExecutorService接口	124
4.3.1  Callable返回任务执行结果	125
4.3.2  shutdown与shutdownNow	127
4.4  Executors工具箱	127
4.4.1  newCachedThreadPool	128
4.4.2  newFixedThreadPool	133
4.4.3  newSingleThreadExecutor	137
4.4.4  newScheduledThreadPool	141
4.4.5  newWorkStealingPool	143
4.5  线程工厂与线程组	151
4.5.1  线程组	151
4.5.2  线程与线程组	152
4.5.3  线程工厂接口	155
4.5.4  默认线程工厂实现	156
4.5.5  线程池与线程工厂	157
4.6  线程池异常处理	158
4.6.1  异常捕获	158
4.6.2  UncaughtExceptionHandler处理异常	158
4.6.3  Future处理异常	161
4.7  本章习题	163
第5章  线程池与锁	165
5.1  重入锁ReentrantLock	165
5.1.1  重入锁	166
5.1.2  互斥锁	167
5.1.3  ReentrantLock与synchronized	169
5.1.4  尝试加锁并限时等待	171
5.2  重入锁与Condition	173
5.2.1  案例分析:厨师与侍者	176
5.2.2  案例分析:缓冲区队列	178
5.3  读锁与写锁	181
5.3.1  案例:并发读写集合	182
5.3.2  案例:Map并发控制	193
5.3.3  数据库事务与锁	197
5.4  公平锁与非公平锁	198
5.5  本章习题	201
第6章  线程池与阻塞队列	202
6.1  Queue接口	202
6.2  BlockingQueue接口	202
6.3  BlockingQueue实现类	203
6.4  LinkedBlockingQueue与ArrayBlockingQueue	203
6.4.1  阻塞队列的单锁与双锁	204
6.4.2  ArrayBlockingQueue并发分析	205
6.4.3  LinkedBlockingQueue并发分析	206
6.4.4  案例:12306抢票	208
6.5  生产者与消费者模式	210
6.5.1  基于管道发送与接收消息	211
6.5.2  基于阻塞队列发送与接收消息	213
6.5.3  案例:医院挂号	213
6.6  SynchronousQueue	217
6.6.1  同步队列应用场景	217
6.6.2  案例:Web服务器处理并发请求	218
6.7  延迟阻塞队列	220
6.7.1  案例:元素延迟出队	221
6.7.2  项目案例:Web服务器会话管理	222
6.8  PriorityBlockingQueue	226
案例:按优先级执行任务	226
6.9  LinkedTransferQueue	228
6.10  LinkedBlockingDeque	229
6.11  本章习题	229
第7章  线程池与AQS	231
7.1  acquire与release	231
7.2  性能目标	232
7.3  设计与实现	233
7.3.1  同步状态	233
7.3.2  阻塞	244
7.3.3  排队	246
7.3.4  条件队列	248
7.4  使用AQS	249
7.4.1  控制公平性	250
7.4.2  同步器	251
7.5  AQS性能	252
7.5.1  过载	253
7.5.2  吞吐量	254
7.6  本章习题	255
第8章  结束线程与线程池任务	257
8.1  stop()与destroy()	257
8.2  状态值结束线程	258
8.3  shutdown()与shutdownNow()	258
8.4  线程休眠	258
8.5  线程中断	258
8.6  Future与FutureTask	258
8.6.1  取消任务	259
8.6.2  任务超时结束	263
8.7  项目案例:所有线程池任务暂停与重启	264
8.8  本章习题	267
第9章  Tomcat线程池技术	268
9.1  自定义ThreadPoolExecutor	268
9.2  Tomcat任务队列	270
9.3  Tomcat任务线程	270
9.4  Tomcat任务线程工厂	271
9.5  Tomcat连接器与线程池	272
9.6  创建Tomcat线程池	274
9.7  Web服务器异步环境	275
案例:AsyncContext调用业务方法	276
9.8  Web服务器NIO	278
案例:服务器NIO处理请求	279
9.9  本章习题	281
第10章  并发编程应用	283
10.1  JVM与多线程	283
10.2  Servlet与多线程	284
10.3  懒汉与恶汉模式	286
10.4  数据库Connection与多线程	288
10.4.1  ThreadLocal与线程私有数据	289
10.4.2  ThreadLocal存储数据库Connection	291
10.4.3  ThreadLocal实现Connection per logic模式	293
10.4.4  ThreadLocal实现Connection per request模式	294
10.5  高并发网站的PageView统计	295
10.6  生成唯一的订单号	296
10.7  浏览器并发请求限制	298
10.8  NIO与多路复用	301
10.9  远程异步访问	302
10.10  防止缓存雪崩的DCL机制	305
10.11  分布式锁解决商品超卖	309
参考文献	314
IV


V