状态的简单演示案例37
1.4.5使用Jstack工具查看线程状态40
1.5线程的基本操作41
1.5.1线程名称的设置和获取41
1.5.2线程的sleep操作43
1.5.3线程的interrupt操作45
1.5.4线程的join操作48
1.5.5线程的yield操作53
1.5.6线程的daemon操作55
1.5.7线程状态总结61
1.6线程池原理与实战62
1.6.1JUC的线程池架构63
1.6.2Executors的4种快捷创建线程池的方法65
1.6.3线程池的标准创建方式72
1.6.4向线程池提交任务的两种方式73
1.6.5线程池的任务调度流程77
1.6.6ThreadFactory(线程工厂)79
1.6.7任务阻塞队列81
1.6.8调度器的钩子方法82
1.6.9线程池的拒绝策略84
1.6.10线程池的优雅关闭87
1.6.11Executors快捷创建线程池的潜在问题93
1.7确定线程池的线程数97
1.7.1按照任务类型对线程池进行分类97
1.7.2为IO密集型任务确定线程数98
1.7.3为CPU密集型任务确定线程数100
1.7.4为混合型任务确定线程数101
1.8ThreadLocal原理与实战104
1.8.1ThreadLocal的基本使用104
1.8.2ThreadLocal的使用场景107
1.8.3使用ThreadLocal进行线程隔离108
1.8.4使用ThreadLocal进行跨函数数据传递109
1.8.5ThreadLocal内部结构演进110
1.8.6ThreadLocal源码分析111
1.8.7ThreadLocalMap源码分析114
1.8.8ThreadLocal综合使用案例119
第2章Java内置锁的核心原理123
2.1线程安全问题123
2.1.1自增运算不是线程安全的123
2.1.2临界区资源与临界区代码段126
2.2synchronized关键字127
2.2.1synchronized同步方法127
2.2.2synchronized同步块128
2.2.3静态的同步方法130
2.3生产者-消费者问题131
2.3.1生产者-消费者模式131
2.3.2一个线程不安全的实现版本132
2.3.3一个线程安全的实现版本139
2.4Java对象结构与内置锁140
2.4.1Java对象结构141
2.4.2MarkWord的结构信息143
2.4.3使用JOL工具查看对象的布局145
2.4.4大小端问题149
2.4.5无锁、偏向锁、轻量级锁和重量级锁150
2.5偏向锁的原理与实战152
2.5.1偏向锁的核心原理152
2.5.2偏向锁的演示案例152
2.5.3偏向锁的膨胀和撤销156
2.6轻量级锁的原理与实战157
2.6.1轻量级锁的核心原理157
2.6.2轻量级锁的演示案例158
2.6.3轻量级锁的分类161
2.6.4轻量级锁的膨胀162
2.7重量级锁的原理与实战162
2.7.1重量级锁的核心原理162
2.7.2重量级锁的开销165
2.7.3重量级锁的演示案例166
2.8偏向锁、轻量级锁与重量级锁的对比169
2.9线程间通信170
2.9.1线程间通信的定义170
2.9.2低效的线程轮询170
2.9.3wait方法和notify方法的原理171
2.9.4“等待-通知”通信模式演示案例174
2.9.5生产者-消费者之间的线程间通信177
2.9.6需要在synchronized同步块的内部使用wait和notify180
第3章CAS原理与JUC原子类182
3.1什么是CAS182
3.1.1Unsafe类中的CAS方法182
3.1.2使用CAS进行无锁编程185
3.1.3使用无锁编程实现轻量级安全自增186
3.1.4字段偏移量的计算189
3.2JUC原子类191
3.2.1JUC中的Atomic原子操作包191
3.2.2基础原子类AtomicInteger192
3.2.3数组原子类AtomicIntegerArray194
3.2.4AtomicInteger线程安全原理195
3.3对象操作的原子性198
3.3.1引用类型原子类198
3.3.2属性更新原子类200
3.4ABA问题201
3.4.1了解ABA问题201
3.4.2ABA问题解决方案203
3.4.3使用AtomicStampedReference解决ABA问题203
3.4.4使用AtomicMarkableReference解决ABA问题205
3.5提升高并发场景下CAS操作的性能207
3.5.1以空间换时间:LongAdder208
3.5.2LongAdder的原理211
3.6CAS在JDK中的广泛应用218
3.6.1CAS操作的弊端和规避措施218
3.6.2CAS操作在JDK中的应用219
第4章可见性与有序性的原理220
4.1CPU物理缓存结构220
4.2并发编程的三大问题222
4.2.1原子性问题222
4.2.2可见性问题223
4.2.3有序性问题224
4.3硬件层的MESI协议原理227
4.3.1总线锁和缓存锁228
4.3.2MSI协议230
4.3.3MESI协议及RFO请求230
4.3.4volatile的原理234
4.4有序性与内存屏障237
4.4.1重排序237
4.4.2As-if-Serial规则238
4.4.3硬件层面的内存屏障240
4.5JMM详解242
4.5.1什么是Java内存模型243
4.5.2JMM与JVM物理内存的区别244
4.5.3JMM的8个操作246
4.5.4JMM如何解决有序性问题248
4.5.5volatile语义中的内存屏障250
4.6Happens-Before规则251
4.6.1Happens-Before规则介绍252
4.6.2规则1:顺序性规则252
4.6.3规则2:volatile规则252
4.6.4规则3:传递性规则255
4.6.5规则4:监视锁规则255
4.6.6规则5:start()规则256
4.6.7规则6:join()规则257
4.7volatile不具备原子性258
4.7.1volatile变量的自增实例258
4.7.2volatile变量的复合操作不具备原子性的原理260
第5章JUC显式锁的原理与实战262
5.1显式锁262
5.1.1显式锁Lock接口263
5.1.2可重入锁ReentrantLock264
5.1.3使用显式锁的模板代码267
5.1.4基于显式锁进行“等待-通知”方式的线程间通信269
5.1.5LockSupport273
5.1.6显式锁的分类276
5.2悲观锁和乐观锁279
5.2.1悲观锁存在的问题279
5.2.2通过CAS实现乐观锁279
5.2.3不可重入的自旋锁280
5.2.4可重入的自旋锁281
5.2.5CAS可能导致“总线风暴”283
5.2.6CLH自旋锁285
5.3公平锁与非公平锁293
5.3.1非公平锁实战293
5.3.2公平锁实战295
5.4可中断锁与不可中断锁296
5.4.1锁的可中断抢占296
5.4.2死锁的监测与中断298
5.5共享锁与独占锁302
5.5.1独占锁302
5.5.2共享锁Semaphore302
5.5.3共享锁CountDownLatch306
5.6读写锁307
5.6.1读写锁ReentrantReadWriteLock308
5.6.2锁的升级与降级310
5.6.3StampedLock312
第6章AQS抽象同步器的核心原理316
6.1锁与队列的关系316
6.2AQS的核心成员318
6.2.1状态标志位318
6.2.2队列节点类319
6.2.3FIFO双向同步队列321
6.2.4JUC显式锁与AQS的关系322
6.2.5ReentrantLock与AQS的组合关系322
6.3AQS中的模板模式325
6.3.1模板模式325
6.3.2一个模板模式的参考实现326
6.3.3AQS的模板流程329
6.3.4AQS中的钩子方法329
6.4通过AQS实现一把简单的独占锁331
6.4.1简单的独占锁的UML类图331
6.4.2简单的独占锁的实现331
6.4.3SimpleMockLock测试用例333
6.5AQS锁抢占的原理335
6.5.1显式锁抢占的总体流程335
6.5.2AQS模板方法:acquire(arg)336
6.5.3钩子实现:tryAcquire(arg)336
6.5.4直接入队:addWaiter337
6.5.5自旋入队:enq338
6.5.6自旋抢占:acquireQueued()339
6.5.7挂起预判:shouldParkAfterFailedAcquire()340
6.5.8线程挂起:parkAndCheckInterrupt()342
6.6AQS的两个关键点:节点的入队和出队343
6.6.1节点的自旋入队343
6.6.2节点的出队343
6.7AQS锁释放的原理345
6.7.1SimpleMockLock独占锁的释放流程345
6.7.2AQS模板方法:release()345
6.7.3钩子实现:tryRelease()346
6.7.4唤醒后继:unparkSuccessor()346
6.8ReentrantLock的抢锁流程347
6.8.1ReentrantLock非公平锁的抢占流程347
6.8.2非公平锁的同步器子类348
6.8.3非公平抢占的钩子方法:tryAcquire(arg)349
6.8.4ReentrantLock公平锁的抢占流程350
6.8.5公平锁的同步器子类350
6.8.6公平抢占的钩子方法:tryAcquire(arg)351
6.8.7是否有后继节点的判断351
6.9AQS条件队列352
6.9.1Condition基本原理352
6.9.2await()等待方法原理353
6.9.3signal()唤醒方法原理355
6.10AQS的实际应用356
第7章JUC容器类358
7.1线程安全的同步容器类358
7.2JUC高并发容器360
7.3CopyOnWriteArrayList362
7.3.1CopyOnWriteArrayList的使用362
7.3.2CopyOnWriteArrayList的原理364
7.3.3CopyOnWriteArrayList读取操作366
7.3.4CopyOnWriteArrayList写入操作366
7.3.5CopyOnWriteArrayList的迭代器实现367
7.4BlockingQueue368
7.4.1BlockingQueue的特点368
7.4.2阻塞队列的常用方法368
7.4.3常见的BlockingQueue370
7.4.4ArrayBlockingQueue的基本使用372
7.4.5ArrayBlockingQueue构造器和成员374
7.4.6非阻塞式添加元素:add()、offer()方法的原理376
7.4.7阻塞式添加元素:put()方法的原理378
7.4.8非阻塞式删除元素:poll()方法的原理380
7.4.9阻塞式删除元素:take()方法的原理381
7.4.10peek()直接返回当前队列的头元素382
7.5ConcurrentHashMap383
7.5.1HashMap和HashTable的问题383
7.5.2JDK1.7版本ConcurrentHashMap的结构384
7.5.3JDK1.7版本ConcurrentHashMap的核心原理385
7.5.4JDK1.8版本ConcurrentHashMap的结构393
7.5.5JDK1.8版本ConcurrentHashMap的核心原理395
7.5.6JDK1.8版本ConcurrentHashMap的核心源码398
第8章高并发设计模式402
8.1线程安全的单例模式402
8.1.1从饿汉式单例到懒汉式单例402
8.1.2使用内置锁保护懒汉式单例404
8.1.3双重检查锁单例模式404
8.1.4使用双重检查锁+volatile405
8.1.5使用静态内部类实现懒汉式单例模式406
8.2Master-Worker模式407
8.2.1Master-Worker模式的参考实现408
8.2.2Netty中Master-Worker模式的实现413
8.2.3Nginx中Master-Worker模式的实现414
8.3ForkJoin模式415
8.3.1ForkJoin模式的原理415
8.3.2ForkJoin框架416
8.3.3ForkJoin框架使用实战416
8.3.4ForkJoin框架的核心API419
8.3.5工作窃取算法421
8.3.6ForkJoin框架的原理423
8.4生产者-消费者模式423
8.5Future模式424
第9章高并发核心模式之异步回调模式426
9.1从泡茶的案例讲起426
9.2join:异步阻塞之闷葫芦427
9.2.1线程的合并流程427
9.2.2调用join()实现异步泡茶喝427
9.2.3join()方法详解429
9.3FutureTask:异步调用之重武器430
9.3.1通过FutureTask获取异步执行结果的步骤431
9.3.2使用FutureTask实现异步泡茶喝431
9.4异步回调与主动调用434
9.5Guava的异步回调模式435
9.5.1详解FutureCallback435
9.5.2详解ListenableFuture436
9.5.3ListenableFuture异步任务437
9.5.4使用Guava实现泡茶喝的实例438
9.5.5Guava异步回调和Java异步调用的区别442
9.6Netty的异步回调模式442
9.6.1GenericFutureListener接口详解443
9.6.2Netty的Future接口详解443
9.6.3ChannelFuture的使用444
9.6.4Netty的出站和入站异步回调444
9.7异步回调模式小结445
第10章CompletableFuture异步回调446
10.1CompletableFuture详解446
10.1.1CompletableFuture的UML类关系446
10.1.2CompletionStage接口447
10.1.3使用runAsync和supplyAsync创建子任务448
10.1.4设置子任务回调钩子449
10.1.5调用handle()方法统一处理异常和结果451
10.1.6线程池的使用452
10.2异步任务的串行执行453
10.2.1thenApply()方法453
10.2.2thenRun()方法455
10.2.3thenAccept()方法455
10.2.4thenCompose()方法456
10.2.54个任务串行方法的区别458
10.3异步任务的合并执行458
10.3.1thenCombine()方法458
10.3.2runAfterBoth()方法460
10.3.3thenAcceptBoth()方法461
10.3.4allOf()等待所有的任务结束462
10.4异步任务的选择执行463
10.4.1applyToEither()方法463
10.4.2runAfterEither()方法465
10.4.3acceptEither()方法465
10.5CompletableFuture的综合案例466
10.5.1使用CompletableFuture实现泡茶喝实例466
10.5.2使用CompletableFuture进行多个RPC调用468
10.5.3使用RxJava模拟RPC异步回调469