1
2.4Java中共享变量的内存可见性问题52
2.5Java中的synchronized关键字54
2.5.1synchronized关键字介绍54
2.5.2synchronized的内存语义55
2.6Java中的volatile关键字55
2.7Java中的原子性操作57
2.8Java中的CAS操作59
2.9Unsafe类59
2.9.1Unsafe类中的重要方法59
2.9.2如何使用Unsafe类61
2.10Java指令重排序65
2.11伪共享67
2.11.1什么是伪共享67
2.11.2为何会出现伪共享68
2.11.3如何避免伪共享70
2.11.4小结72
2.12锁的概述72
2.12.1乐观锁与悲观锁72
2.12.2公平锁与非公平锁75
2.12.3独占锁与共享锁75
2.12.4什么是可重入锁76
2.12.5自旋锁77
2.13总结77
第二部分Java并发编程高级篇
第3章Java并发包中ThreadLocalRandom类原理剖析80
3.1Random类及其局限性80
3.2ThreadLocalRandom82
3.3源码分析84
3.4总结87
第4章Java并发包中原子操作类原理剖析88
4.1原子变量操作类88
4.2JDK8新增的原子操作类LongAdder93
4.2.1LongAdder简单介绍93
4.2.2LongAdder代码分析95
4.2.3小结101
4.3LongAccumulator类原理探究102
4.4总结104
第5章Java并发包中并发List源码剖析105
5.1介绍105
5.2主要方法源码解析106
5.2.1初始化106
5.2.2添加元素106
5.2.3获取指定位置元素108
5.2.4修改指定元素109
5.2.5删除元素110
5.2.6弱一致性的迭代器111
5.3总结114
第6章Java并发包中锁原理剖析115
6.1LockSupport工具类115
6.2抽象同步队列AQS概述122
6.2.1AQS——锁的底层支持122
6.2.2AQS——条件变量的支持128
6.2.3基于AQS实现自定义同步器131
6.3独占锁ReentrantLock的原理136
6.3.1类图结构136
6.3.2获取锁137
6.3.3释放锁142
6.3.4案例介绍143
6.3.5小结145
6.4读写锁ReentrantReadWriteLock的原理145
6.4.1类图结构145
6.4.2写锁的获取与释放147
6.4.3读锁的获取与释放151
6.4.4案例介绍156
6.4.5小结158
6.5JDK8中新增的StampedLock锁探究158
6.5.1概述158
6.5.2案例介绍160
6.5.3小结164
第7章Java并发包中并发队列原理剖析165
7.1ConcurrentLinkedQueue原理探究165
7.1.1类图结构165
7.1.2ConcurrentLinkedQueue原理介绍166
7.1.3小结181
7.2LinkedBlockingQueue原理探究182
7.2.1类图结构182
7.2.2LinkedBlockingQueue原理介绍185
7.2.3小结194
7.3ArrayBlockingQueue原理探究195
7.3.1类图结构195
7.3.2ArrayBlockingQueue原理介绍197
7.3.3小结202
7.4PriorityBlockingQueue原理探究203
7.4.1介绍203
7.4.2PriorityBlockingQueue类图结构203
7.4.3原理介绍205
7.4.4案例介绍214
7.4.5小结216
7.5DelayQueue原理探究217
7.5.1DelayQueue类图结构217
7.5.2主要函数原理讲解219
7.5.3案例介绍222
7.5.4小结224
第8章Java并发包中线程池ThreadPoolExecutor原理探究225
8.1介绍225
8.2类图介绍225
8.3源码分析230
8.3.1publicvoidexecute(Runnablecommand)230
8.3.2工作线程Worker的执行235
8.3.3shutdown操作238
8.3.4shutdownNow操作240
8.3.5awaitTermination操作241
8.4总结242
第9章Java并发包中ScheduledThreadPoolExecutor原理探究243
9.1介绍243
9.2类图介绍243
9.3原理剖析245
9.3.1schedule(Runnablecommand,longdelay,TimeUnitunit)方法246
9.3.2scheduleWithFixedDelay(Runnablecommand,longinitialDelay,longdelay,TimeUnitunit)方法252
9.3.3scheduleAtFixedRate(Runnablecommand,longinitialDelay,longperiod,TimeUnitunit)方法254
9.4总结255
第10章Java并发包中线程同步器原理剖析256
10.1CountDownLatch原理剖析256
10.1.1案例介绍256
10.1.2实现原理探究259
10.1.3小结263
10.2回环屏障CyclicBarrier原理探究264
10.2.1案例介绍264
10.2.2实现原理探究268
10.2.3小结272
10.3信号量Semaphore原理探究272
10.3.1案例介绍272
10.3.2实现原理探究276
10.3.3小结281
10.4总结281
第三部分Java并发编程实践篇
第11章并发编程实践284
11.1ArrayBlockingQueue的使用284
11.1.1异步日志打印模型概述284
11.1.2异步日志与具体实现285
11.1.3小结293
11.2Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用293
11.2.1生产者——Acceptor线程294
11.2.2消费者——Poller线程298
11.2.3小结300
11.3并发组件ConcurrentHashMap使用注意事项300
11.4SimpleDateFormat是线程不安全的304
11.4.1问题复现304
11.4.2问题分析305
11.4.3小结309
11.5使用Timer时需要注意的事情309
11.5.1问题的产生309
11.5.2Timer实现原理分析310
11.5.3小结313
11.6对需要复用但是会被下游修改的参数要进行深复制314
11.6.1问题的产生314
11.6.2问题分析316
11.6.3小结318
11.7创建线程和线程池时要指定与业务相关的名称319
11.7.1创建线程需要有线程名319
11.7.2创建线程池时也需要指定线程池的名称321
11.7.3小结325
11.8使用线程池的情况下当程序结束时记得调用shutdown关闭线程池325
11.8.1问题复现325
11.8.2问题分析327
11.8.3小结329
11.9线程池使用FutureTask时需要注意的事情329
11.9.1问题复现329
11.9.2问题分析332
11.9.3小结335
11.10使用ThreadLocal不当可能会导致内存泄漏336
11.10.1为何会出现内存泄漏336
11.10.2在线程池中使用ThreadLocal导致的内存泄漏339
11.10.3在Tomcat的Servlet中使用ThreadLocal导致内存泄漏341
11.10.4小结344
11.11总结344