新書推薦:
《
穿在身上的历史:世界服饰图鉴(增订珍藏版)
》
售價:HK$
557.8
《
历史的严妆:解读道学阴影下的南宋史学(中华学术·有道)
》
售價:HK$
109.8
《
海外中国研究·江南:中国文雅的源流
》
售價:HK$
76.2
《
迟缓的巨人:“大而不能倒”的反思与人性化转向
》
售價:HK$
77.3
《
我们去往何方:身体、身份和个人价值
》
售價:HK$
67.0
《
大学问·批判的武器:罗莎·卢森堡与同时代思想者的论争
》
售價:HK$
98.6
《
低薪困境:剖析日本经济低迷的根本原因
》
售價:HK$
66.1
《
穷人的银行家(诺贝尔和平奖获得者穆罕默德·尤努斯自传)
》
售價:HK$
76.2
|
內容簡介: |
本书从实际需求出发,全面细致地介绍了高并发编程的基础知识、核心原理、实战案例和系统架构等内容。通过阅读和学习本书,读者可以对高并发编程有更加全面、深入、透彻的理解,提高对高并发编程问题的处理能力和项目实战能力,并站在更高的层面解决高并发编程系统架构问题。
|
目錄:
|
第1篇 基础知识
第1章 操作系统线程调度2
1.1 冯·诺依曼体系结构2
1.1.1 概述2
1.1.2 计算机五大组成部分3
1.2 CPU架构5
1.2.1 CPU的组成部分5
1.2.2 CPU逻辑结构6
1.2.3 单核CPU的不足8
1.2.4 多核CPU架构8
1.2.5 多CPU架构10
1.3 操作系统线程11
1.3.1 用户级线程11
1.3.2 内核级线程12
1.3.3 混合级线程14
1.4 Java线程与操作系统线程的关系15
1.5 本章总结16
第2章 并发编程概述17
2.1 并发编程的基本概念17
2.1.1 程序17
2.1.2 进程与线程17
2.1.3 线程组18
2.1.4 用户线程与守护线程19
2.1.5 并行与并发20
2.1.6 同步与异步21
2.1.7 共享与独享21
2.1.8 临界区22
2.1.9 阻塞和非阻塞22
2.2 并发编程的风险22
2.2.1 安全性问题22
2.2.2 活跃性问题23
2.2.3 性能问题24
2.3 并发编程中的锁24
2.3.1 悲观锁与乐观锁24
2.3.2 公平锁与非公平锁25
2.3.3 独占锁与共享锁26
2.3.4 可重入锁与不可重入锁26
2.3.5 可中断锁与不可中断锁26
2.3.6 读/写锁27
2.3.7 自旋锁27
2.3.8 死锁、饥饿与活锁27
2.4 本章总结28
第2篇 核心原理
第3章 并发编程的三大核心问题30
3.1 分工问题30
3.1.1 类比现实案例30
3.1.2 并发编程中的分工32
3.2 同步问题32
3.2.1 类比现实案例33
3.2.2 并发编程中的同步33
3.3 互斥问题35
3.3.1 类比现实案例35
3.3.2 并发编程中的互斥35
3.4 本章总结36
第4章 并发编程的本质问题37
4.1 计算机的核心矛盾37
4.1.1 核心矛盾概述37
4.1.2 CPU如何解决核心矛盾38
4.1.3 操作系统如何解决核心矛盾38
4.1.4 编译程序如何解决核心矛盾38
4.1.5 引发的问题39
4.2 原子性39
4.2.1 原子性概述39
4.2.2 原子性问题41
4.2.3 Java中的原子性问题42
4.2.4 原子性问题总结46
4.3 可见性46
4.3.1 可见性概述46
4.3.2 可见性问题47
4.3.3 Java中的可见性问题49
4.3.4 可见性问题总结51
4.4 有序性51
4.4.1 有序性概述51
4.4.2 有序性问题52
4.4.3 Java中的有序性问题53
4.4.4 有序性问题总结56
4.5 解决方案57
4.5.1 原子性问题解决方案57
4.5.2 可见性与有序性问题解决方案57
4.6 本章总结58
第5章 原子性的核心原理59
5.1 原子性原理59
5.2 处理器保证原子性60
5.2.1 CPU保证基本内存操作的原子性60
5.2.2 总线锁保证原子性60
5.2.3 缓存锁保证原子性62
5.3 互斥锁保证原子性62
5.3.1 互斥锁模型62
5.3.2 优化后的互斥锁模型63
5.4 CAS保证原子性64
5.5 本章总结64
第6章 可见性与有序性核心原理65
6.1 CPU多级缓存架构65
6.1.1 CPU为何使用多级缓存架构65
6.1.2 CPU多级缓存架构原理66
6.1.3 CPU的计算流程67
6.2 缓存一致性68
6.2.1 什么是缓存一致性68
6.2.2 缓存一致性协议69
6.2.3 MESI协议缓存状态70
6.2.4 MESI协议的状态转换70
6.2.5 MESI协议带来的问题76
6.3 伪共享76
6.3.1 伪共享的概念76
6.3.2 伪共享产生的场景77
6.3.3 如何解决伪共享问题77
6.4 volatile核心原理78
6.4.1 保证可见性核心原理78
6.4.2 保证有序性核心原理79
6.4.3 volatile的局限性81
6.5 内存屏障82
6.5.1 编译器重排序82
6.5.2 CPU重排序83
6.5.3 as-if-serial原则83
6.5.4 计算机硬件实现的内存屏障84
6.6 Java内存模型84
6.6.1 Java内存模型的概念85
6.6.2 Java内存模型的八大操作85
6.6.3 Java内存模型解决可见性与有序性问题87
6.7 Happens-Before原则90
6.7.1 Happens-Before原则概述90
6.7.2 程序次序原则90
6.7.3 volatile变量原则91
6.7.4 传递原则91
6.7.5 锁定原则91
6.7.6 线程启动原则92
6.7.7 线程终结原则93
6.7.8 线程中断原则93
6.7.9 对象终结原则94
6.8 本章总结95
第7章 synchronized核心原理96
7.1 synchronized用法96
7.1.1 同步实例方法97
7.1.2 同步静态方法98
7.1.3 同步代码块99
7.2 Java对象结构102
7.2.1 对象结构总览102
7.2.2 对象头103
7.2.3 实例数据103
7.2.4 对齐填充103
7.3 Java对象头104
7.3.1 Mark Word104
7.3.2 类型指针106
7.3.3 数组长度106
7.4 使用JOL查看对象信息107
7.4.1 引入JOL环境依赖107
7.4.2 打印对象信息107
7.4.3 打印对象锁状态109
7.5 synchronized核心原理115
7.5.1 synchronized底层原理115
7.5.2 Monitor锁原理116
7.5.3 反编译synchronized方法118
7.5.4 反编译synchronized代码块119
7.6 偏向锁121
7.6.1 偏向锁核心原理122
7.6.2 偏向锁的撤销122
7.6.3 偏向锁案例123
7.7 轻量级锁124
7.7.1 轻量级锁核心原理124
7.7.2 轻量级锁案例126
7.8 重量级锁127
7.8.1 重量级锁核心原理127
7.8.2 重量级锁案例127
7.9 锁升级的过程129
7.10 锁消除130
7.11 本章总结131
第8章 AQS核心原理132
8.1 AQS核心数据结构132
8.1.1 AQS数据结构原理132
8.1.2 AQS内部队列模式133
8.2 AQS底层锁的支持134
8.2.1 核心状态位134
8.2.2 核心节点类135
8.2.3 独占锁模式137
8.2.4 共享锁模式142
8.3 本章总结145
第9章 Lock锁核心原理146
9.1 显示锁原理146
9.2 公平锁与非公平锁原理148
9.2.1 公平锁原理148
9.2.2 ReentrantLock中的公平锁149
9.2.3 公平锁实战153
9.2.4 非公平锁原理154
9.2.5 ReentrantLock中的非公平锁156
9.2.6 非公平锁实战159
9.3 悲观锁与乐观锁原理159
9.3.1 悲观锁原理160
9.3.2 悲观锁实战160
9.3.3 乐观锁原理162
9.3.4 乐观锁实战162
9.4 可中断锁与不可中断锁原理163
9.4.1 可中断锁原理163
9.4.2 可中断锁实战164
9.4.3 不可中断锁原理166
9.4.4 不可中断锁实战166
9.5 排他锁与共享锁原理167
9.5.1 排他锁原理167
9.5.2 排他锁实战167
9.5.3 共享锁原理169
9.5.4 共享锁实战169
9.6 可重入锁原理170
9.6.1 可重入锁原理170
9.6.2 可重入锁实战172
9.7 读/写锁原理175
9.7.1 读/写锁原理175
9.7.2 ReadWriteLock读/写锁176
9.7.3 ReadWriteLock锁降级177
9.7.4 StampedLock读/写锁178
9.7.5 StampedLock锁的升级与降级179
9.7.6 读/写锁实战182
9.8 LockSupport原理185
9.8.1 LockSupport原理185
9.8.2 LockSupport实战185
9.9 本章总结187
第10章 CAS核心原理188
10.1 CAS的基本概念188
10.2 CAS的核心类Unsafe189
10.2.1 Unsafe类的核心方法190
10.2.2 Unsafe类实战192
10.3 使用CAS实现count 194
10.3.1 案例分析194
10.3.2 程序实现194
10.3.3 测试程序198
10.4 ABA问题199
10.4.1 ABA问题概述199
10.4.2 ABA问题解决方案200
10.4.3 Java如何解决ABA问题200
10.5 本章总结202
第11章 死锁的核心原理203
11.1 死锁的基本概念203
11.2 死锁的分析204
11.2.1 线程不安全204
11.2.2 串行执行206
11.2.3 发生死锁208
11.3 形成死锁的必要条件210
11.4 死锁的预防210
11.5 本章总结216
第12章 锁优化217
12.1 缩小锁的范围217
12.2 减小锁的粒度219
12.3 锁分离220
12.4 锁分段221
12.5 锁粗化221
12.6 避免热点区域问题222
12.7 独占锁的替换方案223
12.8 其他优化方案223
12.9 本章总结223
第13章 线程池核心原理224
13.1 线程池的核心状态224
13.1.1 核心状态说明224
13.1.2 核心状态的流转过程225
13.2 线程池的创建方式227
13.2.1 通过Executors类创建线程池227
13.2.2 通过ThreadPoolExecutor类创建线程池229
13.2.3 通过ForkJoinPool类创建线程池232
13.2.4 通过ScheduledThreadPoolExecutor类创建线程池234
13.3 线程池执行任务的核心流程235
13.3.1 执行任务的流程235
13.3.2 拒绝策略237
13.4 线程池的关闭方式238
13.4.1 shutdown()方法238
13.4.2 shutdownNow()方法238
13.5 如何确定线程数238
13.5.1 CPU密集型程序238
13.5.2 I/O密集型程序239
13.6 本章总结239
第14章 ThreadLocal核心原理240
14.1 ThreadLocal的基本概念240
14.2 ThreadLocal的使用案例241
14.3 ThreadLocal的核心原理244
14.3.1 Thread类源码244
14.3.2 set()方法244
14.3.3 get()方法245
14.3.4 remove()方法247
14.4 ThreadLocal变量的不继承性247
14.5 InheritableThreadLocal的使用案例249
14.6 InheritableThreadLocal的核心原理250
14.7 本章总结253<
|
|