描述
开 本: 128开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121421365丛书名: 咕泡教育Java架构师成长丛书
第1章 Java线程的实践及原理揭秘 1
1.1 如何理解系统并发 1
1.2 系统如何支撑高并发 2
1.3 线程的前世今生 3
1.3.1 大白话理解进程和线程 3
1.3.2 线程的核心价值 5
1.3.3 如何理解并发和并行 6
1.4 在Java中如何使用多线程 6
1.4.1 实现Runnable接口创建线程 6
1.4.2 继承Thread类创建线程 7
1.4.3 实现Callable接口并创建带返回值的线程 7
1.5 多线程如何应用到实际场景 8
1.5.1 ServerSocket 9
1.5.2 SocketThread 10
1.6 多线程的基本原理 11
1.7 线程的运行状态 11
1.7.1 线程运行状态演示 12
1.7.2 线程运行状态流转图 14
1.8 如何正确终止线程 15
1.8.1 关于安全中断线程的思考 17
1.8.2 安全中断线程之interrupt 17
1.8.3 如何中断处于阻塞状态下的线程 18
1.8.4 interrupt()方法的实现原理 21
1.9 理解上下文切换带来的性能影响 24
1.9.1 上下文切换带来的问题 25
1.9.2 什么是上下文切换 27
1.9.3 如何减少上下文切换 29
1.10 揭秘守护线程 30
1.10.1 守护线程的应用场景 32
1.10.2 守护线程使用注意事项 32
1.11 快速定位并解决线程导致的生产问题 33
1.11.1 死锁导致请求无法响应 35
1.11.2 CPU占用率很高,响应很慢 36
1.12 本章小结 38
第2章 深度揭秘synchronized实现原理 39
2.1 揭秘多线程环境下的原子性问题 40
2.1.1 深入分析原子性问题的本质 41
2.1.2 关于原子性问题的解决办法 43
2.2 Java中的synchronized同步锁 44
2.2.1 synchronized的使用方法 44
2.2.2 了解synchronized同步锁的作用范围 45
2.3 关于synchronized同步锁的思考 49
2.4 synchronzied同步锁标记存储分析 49
2.4.1 揭秘Mark Word的存储结构 50
2.4.2 图解分析对象的实际存储 52
2.4.3 通过ClassLayout查看对象内存布局 53
2.4.4 Hotspot虚拟机中对象存储的源码 57
2.5 synchronized的锁类型 59
2.5.1 偏向锁的原理分析 60
2.5.2 轻量级锁的原理分析 64
2.5.3 重量级锁的原理分析 65
2.6 关于CAS机制的实现原理分析 68
2.6.1 CAS在AtomicInteger中的应用 70
2.6.2 CAS实现自旋锁 72
2.6.3 CAS在JVM中的实现原理分析 73
2.7 锁升级的实现流程 76
2.7.1 偏向锁的实现原理 77
2.7.2 轻量级锁的实现原理 82
2.7.3 重量级锁的实现原理 86
2.8 synchronized使用不当带来的死锁问题 89
2.8.1 死锁的案例分析 90
2.8.2 死锁产生的必要条件 92
2.8.3 如何解决死锁问题 92
2.9 本章小结 96
第3章 volatile为什么能解决可见性和有序性问题 97
3.1 关于线程的可见性问题分析 97
3.1.1 思考导致问题的原因 98
3.1.2 volatile关键字解决可见性问题 99
3.2 深度理解可见性问题的本质 100
3.2.1 如何化提升CPU利用率 100
3.2.2 详述CPU高速缓存 101
3.2.3 CPU缓存一致性问题 107
3.2.4 总结可见性问题的本质 111
3.3 volatile如何解决可见性问题 112
3.4 指令重排序导致的可见性问题 113
3.4.1 什么是指令重排序 114
3.4.2 as-if-serial语义 116
3.5 从CPU层面深度剖析指令重排序的本质 117
3.5.1 CPU优化—Store Buffers 117
3.5.2 CPU优化—Store Forwarding 119
3.5.3 CPU优化—Invalidate Queues 122
3.6 通过内存屏障解决内存系统重排序问题 125
3.6.1 内存屏障详解 125
3.6.2 通过内存屏障防止重排序 127
3.6.3 不同CPU的重排序规则 128
3.6.4 总结CPU层面的可见性问题 129
3.7 Java Memory Mode 129
3.7.1 从JVM和硬件层面理解Java Memory Mode 130
3.7.2 JVM提供的内存屏障指令 133
3.8 揭秘volatile实现原理 136
3.9 Happens-Before模型 138
3.9.1 程序顺序规则 138
3.9.2 传递性规则 139
3.9.3 volatile变量规则 139
3.9.4 监视器锁规则 140
3.9.5 start规则 141
3.9.6 join规则 141
3.10 本章小结 142
第4章 深入浅出分析J.U.C中的重入锁和读写锁 143
4.1 J.U.C中与锁相关的API 143
4.1.1 ReentrantLock的基本应用 144
4.1.2 ReentrantReadWriteLock的基本应用 145
4.1.3 StampedLock的基本应用 147
4.2 ReentrantLock的设计猜想 149
4.2.1 锁的互斥,必须要竞争同一个共享变量 150
4.2.2 没有竞争到锁的线程,需要阻塞 151
4.2.3 需要一个容器存储被阻塞的线程 151
4.3 ReentrantLock实现原理分析 151
4.4 AbstractQueuedSynchronizer 152
4.5 ReentrantLock源码分析 154
4.5.1 ReentrantLock.lock()方法 154
4.5.2 AbstractQueuedSynchronizer.acquire()方法 156
4.5.3 NonfairSync.tryAcquire()方法 156
4.5.4 ReentrantLock.nofairTryAcquire()方法 157
4.5.5 AbstractQueuedSynchronizer.addWaiter()方法 158
4.5.6 AQS.acquireQueued()方法 159
4.6 ReentrantLock释放锁源码分析 162
4.6.1 ReentrantLock.tryRelease()方法 163
4.6.2 unparkSuccessor()方法 163
4.6.3 释放锁的线程继续执行 164
4.7 分析ReentrantReadWriteLock类的原理 166
4.7.1 WriteLock锁竞争原理 167
4.7.2 ReadLock锁竞争原理 170
4.7.3 ReentrantReadWriteLock中的锁降级 177
4.8 StampedLock的原理分析 179
4.8.1 核心内部类分析 180
4.8.2 StampedLock原理图解 182
4.8.3 StampedLock锁升级 184
4.9 本章小结 187
第5章 从线程通信来窥探并发中的条件等待机制 188
5.1 wait/notify 189
5.1.1 wait()/notify()方法使用实战 189
5.1.2 图解生产者/消费者 192
5.1.3 wait()/notify()方法的原理 193
5.1.4 wait()/notify()方法为什么要加同步锁 195
5.2 通过Thread.join获取线程执行结果 195
5.2.1 Thread.join()方法的执行流程 196
5.2.2 Thread.join()方法的实现原理 196
5.3 J.U.C中的条件控制Condition 198
5.3.1 Condition的基本应用 199
5.3.2 基于Condition的手写阻塞队列 201
5.4 Condition的设计猜想 203
5.5 Condition的源码分析 203
5.5.1 Condition.await()方法 204
5.5.2 Condition.signal()方法 208
5.5.3 锁竞争成功后的执行流程 210
5.6 本章小结 213
第6章 J.U.C并发工具集实战及原理分析 214
6.1 CountDownLatch简单介绍 214
6.1.1 CountDownLatch的基本使用 215
6.1.2 CountDownLatch运行流程 216
6.1.3 如何落地到实际应用 216
6.1.4 CountDownLatch的其他用法 220
6.2 CountDownLatch底层原理 221
6.2.1 让线程等待的await()方法到底做了什么 222
6.2.2 深入分析countDown()方法源码 224
6.2.3 线程被唤醒后的执行逻辑 228
6.3 Semaphore 230
6.3.1 Semaphore使用案例 231
6.3.2 Semaphore方法及场景说明 232
6.4 Semaphore原理分析 233
6.4.1 Semaphore令牌获取过程分析 233
6.4.2 Semaphore令牌释放过程分析 236
6.5 CyclicBarrier 237
6.5.1 CyclicBarrier的基本使用 237
6.5.2 基本原理分析 239
6.6 CyclicBarrier实现原理及源码 239
6.6.1 await()方法 241
6.6.2 reset()方法 244
6.7 本章小结 244
第7章 深度探索并发编程不得不知的工具 245
7.1 初步认识ThreadLocal 245
7.2 ThreadLocal的应用场景分析 247
7.3 ThreadLocal解决SimpleDateFormat线程安全问题 249
7.3.1 SimpleDateFormat线程安全问题的原理 250
7.3.2 ThreadLocal实现线程安全性 253
7.4 ThreadLocal实现原理分析 254
7.4.1 set()方法源码分析 255
7.4.2 get()方法源码分析 265
7.4.3 ThreadLocal内存泄漏 266
7.5 任务拆分与聚合Fork/Join 269
7.5.1 Fork/Join的核心API说明 269
7.5.2 Fork/Join的基本使用 270
7.6 Fork/Join的实现原理 272
7.6.1 WorkQueue的原理 274
7.6.2 工作窃取算法 275
7.7 Fork/Join的核心源码分析 275
7.7.1 任务提交过程详解 276
7.7.2 唤醒或者创建工作线程 281
7.7.3 工作线程和工作队列的绑定 283
7.7.4 ForkJoinWorkerThread运行过程 285
7.8 使用Fork/Join解决实际问题 286
7.8.1 项目结构说明 286
7.8.2 ILoadDataProcessor 287
7.8.3 AbstractLoadDataProcessor 288
7.8.4 业务服务类 288
7.8.5 Item聚合任务服务 289
7.8.6 ComplexTradeTaskService 291
7.8.7 测试代码 292
7.9 本章小结 293
第8章 深度剖析阻塞队列的设计原理及实现 294
8.1 什么是阻塞队列 294
8.2 Java中提供的阻塞队列 295
8.3 阻塞队列中提供的方法 296
8.4 阻塞队列的使用 297
8.4.1 生产者/消费者模型代码 297
8.4.2 图解阻塞队列实现原理 299
8.5 阻塞队列应用实战 299
8.5.1 基于阻塞队列的责任链源码 300
8.5.2 阻塞队列实战场景总结 304
8.6 详解J.U.C中阻塞队列的使用 305
8.6.1 基于数组结构的阻塞队列ArrayBlockingQueue 305
8.6.2 基于链表的阻塞队列LinkedBlockingQueue 306
8.6.3 优先级阻塞队列PriorityBlockingQueue 308
8.6.4 延迟阻塞队列DelayQueue 310
8.6.5 无存储结构的阻塞队列SynchronousQueue 314
8.6.6 阻塞队
评论
还没有评论。