天天看点

《Java并发编程的艺术》知识点目录

《Java并发编程的艺术》知识点目录

《Java并发编程的艺术》知识点目录

p1 上下文切换

p1 多线程一定快吗

p3 为什么并发执行的速度有时比串行慢

p3 测试上下文切换次数和时长

p3 如何减少上下文切换

P4 减少上下文切换实战

p5 死锁

p6 避免死锁的几个常见方法

1.3 资源限制的挑战

p6 资源限制

p8 volatile的定义

p9 一些有关volatile实现原理的cpu术语的定义

p9 volatile是如何实现可见性的

p9 Lock前缀指令在多核处理器下引发的事情

p10 volatile的两条实现原则

p10 缓存一致性和缓存锁定

p11 追加64字节来为volatile优化性能(解决伪共享问题)

p11 不应该追加到64字节的情况

p12 Java中的每一个对象都可以作为锁

p12 synchonized在JVM中的实现原理

p12 Java对象头及其数据组成

p13 锁的升级与对比

p13 JavaSE1.6以后锁的四种状态级别

p13 偏向锁

p13 偏向锁的定义、使用和撤销

p14 偏向锁获得和撤销的流程图

p14 利用JVM关闭偏向锁的延迟和彻底关闭偏向锁

p15 轻量级锁

p15 轻量级锁的加锁和解锁

p15 轻量级锁的自旋

P15 争夺锁导致的锁膨胀流程图

p16 偏向锁、轻量级锁、重量级锁优缺点的对比

p16 缓存行、比较并交换、CPU流水线、内存顺序冲突定义

p17 处理器如何实现原子操作

p17 使用总线锁保证原子性

p17 使用缓存锁保证原子性

P18 使用循环CAS实现原子操作

p19 CAS实现原子操作的三大问题(ABA、循环时间长开销大、只能保证一个共享变量的原子操作)

p20 处理器提供的pause指令

p20 使用锁机制实现原子操作

p21 并发编程模型的两个关键问题

p21 线程通信的两种方式及Java所使用的共享内存模型

p22 Java内存模型的抽象结构

p22 JMM如何控制Java线程通信

p22 JMM控制下两个线程通信所必须的步骤

p23 从源代码到指令序列的重排序

P24 内存屏障概念(通过指令禁止特定类型的重排序)

p24 并发编程模型的分类

p24 写缓冲区及其特性

p25 处理器的重排序规则

p26 内存屏障类型表

p26 happens-before简介

p27 happens-before与JMM关系

p28 数据依赖性

p28 as-if-serial语义

p29 程序顺序规则

p29 重排序对多线程的影响

p31 控制依赖关系

p31 编译器和处理器的猜测

p31 重排序缓冲

p31 数据竞争与顺序一致性

p31 数据竞争

p32 顺序一致性

p32 顺序一致性内存模型

p33 读/写操作串行化

p34 程序的顺序一致性结果

p35 未同步程序的执行特性

p36 未同步程序在顺序一致性模型和JMM中执行的差异

p36 总线事务

p37 JVM不被强求对64位浮点数的写操作具有原子性

p38 volatile的特性

p39 volatile写-读建立的happens-before关系

p39 volatile写-读建立的内存语义

p40 volatile写的内存语义

p41 volatile读的内存语义

p42 volatile内存语义的实现

p42 volatile重排序规则表

p43 volatile中基于保守策略的JMM内存屏障插入策略

p44 为什么要在volatile写的后面插入一个StoreLoad屏障

p44 编译器自动省略不必要的屏障

p45 X86处理器仅对写-读操作做重排序

p46 JSR-133为什么要增强volatile的内存语义

p47 volatile和锁的对比

p47 锁的释放-所建立的happens-before关系

p48 锁的释放和获取的内存语义

p50 锁内存语义的实现

p50 ReentrantLock的实现依赖于Java同步框架AQS

p51 公平锁加锁调用轨迹

p52 公平锁解锁调用轨迹

p52 非公平锁的内存语义实现

p52 CAS

P53 CAS是如何同时具有volatile读和volatile写的内存语义的

p53 intel手册对lock前缀的说明

p54 公平锁和非公平锁内存语义总结

p54 锁释放-获取内存语义的两种实现

p54 Concurrent包的实现

p54 Java线程通信的四种方式

p54 concurrent包的通用化实现模式

p55 concurrent包的实现示意图

p55 final域的重排序规则

p55 对于final域,编译器和处理器要遵守的两个重排序规则

p56 写final域的重排序规则

p57 读final域的重排序规则

p59 final域为引用类型时的重排序规则

p59 为什么final域不能从构造函数中“溢出”

p62 JSR-133为什么要增强final的语义

p62 JMM的设计

p62 设计JMM时需要考虑的关键因素

p63 JMM对两种不同类型重排序的不同策略

p63 JMM设计示意图

p64 happens-before的定义

p65 happens-before规则

p66 start()规则

p66 join()规则

p67 延迟初始化

p68 双重检查锁定(一个错误的优化)

p69 问题的根源

p69 intra-thread semantics(允许单线程中不影响结果的重排序)

p71 两个方法实现线程安全的延迟初始化

p71 基于volatile-利用双重检查锁定实现延迟初始化

p72 基于类初始化过程中的锁实现延迟初始化

p73 类和接口的初始化时机

p73 类和接口的初始化锁LC

p73 类和接口的初始化过程(五个阶段,下面不再列举)

p78 对比基于volatile的双重检查锁定的方案和基于类初始化的方案

p78 处理器的内存模型

p79 TSO、PSO、RMO、PowerPC内存模型

p79 处理器内存模型特征表

p80 JMM插入内存屏障的示意图

p80 各种内存模型之间的关系

p80 以程序类型分类,三种JMM的内存可见性保证

p81 为未同步程序提供的最小安全性保障

p81 各种CPU内存模型的强弱对比示意图

p81 JSR-133 对 JDK5 之前的旧内存模型的修补

p82 不同内存可见性的三类程序的执行结果对比

p83 什么是线程

p84 为什么要使用多线程(更多的处理器核心、更快的响应时间、更好的编程模型)

p85 什么是线程优先级

p85 设置线程优先级的规律

p86 线程优先级不能作为程序正确性的依赖

p87 线程的状态

p89 Java线程状态变迁图

p90 Daemon线程(守护线程)

p91 构造线程

p92 初始化线程对象

p92 启动线程

p92 理解中断

p92 抛出InterruptedException之前会清除中断标识位

p93 过期的suspend()、resume()和stop()

p95 安全地终止线程

p96 volatile和synchronized关键字

p96 每个线程可以拥有对象/对象的成员变量的拷贝

p96 volatile的作用

p96 synchronized的作用

p97 synchronized关键字的实现细节

p97 对象的监视器(monitor)

p98 对象、监视器、同步队列和执行线程之间的关系

p98 等待/通知机制

p99 等待/通知相关方法

p100 调用wati()、notify()和notifyAll()时需要注意的细节

p101 等待/通知基本范式(生产者消费者问题)

p102 管道输入/输出流(piped)

p103 Thread.join()的使用

p105 ThreadLocal的使用

p106 等待超时模式

p106 一个简单的数据库连接池示例

p110 线程池技术及其示例

p114 一个基于线程池技术的简单Web服务器

p120 Lock的使用方式

p120 Lock提供的synchoronized没有的特征(非阻塞获取锁、被中断地获取锁、超时获取锁)

p120 Lock的API

p121 队列同步器AbstractQueuedSynchronizer

p121 同步器提供的三个基本方法 — getState()、setState()和compareAndSetState()

p121 锁和同步器的关系

p121 队列同步器的接口与示例

p121 同步器可重写的方法

p122 同步器提供的模板方法

p122 独占锁

p124 队列同步器的实现分析

p124 同步队列

p124 同步队列中的节点,及其属性类型与名称及描述

p125 同步队列的基本结构

p126 独占式同步状态获取与释放

p128 独占式同步状态获取流程

p129 共享式同步状态获取与释放

p131 独占式超时获取同步状态

p133 自定义同步组件 - TwinsLock

p134 自定义同步器定义为自定义同步组件的内部类

p136 重入锁ReentrantLock

p136 锁获取的公平性问题

p136 重进入的实现

p137 公平与非公平获取锁的区别

p140 读写锁

p141 读写锁的接口与示例

p141 ReentrantReadWriteLock

p142 读写锁的实现分析

p142 一个整型变量上维护多种状态 - 按位切割使用

P145 锁降级

p146 LockSupport提供的阻塞和唤醒方法

p147 阻塞对象Blocker在LockSupport中的作用(由dump体现)

p147 Object的监视器方法与Condition接口的对比

p148 Condition接口与示例

p148 调用Condition的方法前应该先获取锁

p148 Condition的部分方法以及描述

p149 有界队列

p150 Condition的实现分析

p151 await和signal的实质

p155 为什么要使用ConcurrentHashMap

p156 锁分段技术

p156 ConcurrentHashMap的结构

p157 ConcurrentHashMap的初始化

p159 在分段锁中定位Segment

P160 ConcurrentHashMap的操作(get、put、size)

p160 ConcurrentHashMap的get方法里将共享变量定义为volatile

p161 实现线程安全的队列的方法

p162 ConcurrentLinkedQueue的结构

p162 入队列

p165 HOPS的设计意图

p163 出队列

p167 什么是阻塞队列

p167 阻塞队列不可用时由不同方法提供的四种处理方式

p168 JDK7提供的7个阻塞队列

P168 队列ArrayBlockingQueue - 数组结构组成的有界阻塞队列

p169 队列LinkedBlockingQueue - 链表实现的(伪)有界阻塞队列

p169 队列PriorityBlockingQueue - 支持优先级的有界阻塞队列

p169 队列DelayQueue - 支持延时获取元素的无界等待队列

p171 队列SynchronousQueue - 不存储元素的阻塞队列

p171 队列LinkedTransferQueue - 由链表结构组成的无界阻塞队列

p172 队列LinkedBlockingDeque - 链表结构组成的双向阻塞队列

p172 阻塞队列的实现原理

p174 native方法unsafe.park

p174 JVM实现park方法

p175 什么是Fork/Join框架

p176 工作窃取算法

p177 Fork/Join框架的设计

p177 RecursiveAction和RecursiveTask

p177 使用Fork/Join框架

p179 Fork/Join框架的异常处理

p179 Fork/Join框架的实现原理

p182 Atomic包

p182 三种原子更新基本类型类(Boolean、Integer、Long)

p184 如何原子更新其他的基本类型

p184 三种原子更新数组(Integer、Long、Reference)

p185 AtomicIntegerArray对内部元素修改时,不影响构造时传入的数组

p185 三种原子更新引用类型(Reference、ReferenceFieldUpdater、MarkableReference)

P187 三种原子更新字段类(IntegerFieldUpdater、LongFieldUpdater、StampedReference)

p189 CountDownLatch允许一个或多个线程等待其他线程完成操作

p190 join方法

p191 让一组线程达到后被阻塞的可循环使用屏障CyclicBarrier

p191 CyclicBarrier简介(使用方式)

p193 CyclicBarrier的应用场景

p195 CyclicBarrier和CountDownLatch的区别

p195 CyclicBarrier的其他有用的方法(reset、isBroken、getNumberWaiting)

P196 信号量Semaphore

p196 Semaphore的应用场景

p197 Semaphore的其他方法

p198 交换者Exchanger

p200 线程池带来的三个好处

p200 线程池的处理流程

p201 ThreadPoolExecutor执行execute方法的四种情况

p203 线程池的创建和构造参数介绍

p204 四种队列和线程池都满了时的饱和策略

p205 向线程池提交任务

p205 关闭线程池

p206 合理配置线程池

p206 线程池的监控

p208 Java线程的执行机制由Executor框架提供

p208 Executor的两级调度模型

p208 Executor框架的结构与成员

p209 Executor框架的结构

p210 Executor框架的类与接口示意图

p210 Executor框架的使用示意图

p210 Executor框架使用流程

p211 Executor框架的成员

p211 ThreadPoolExecutor介绍(FixedThreadPool、SingleThreadExecutor、CachedThreadPool)

p211 ScheduledThreadPoolExecutor介绍(ScheduledThreadPoolExecutor、SingleThreadScheduledExecutor)

p212 Future接口

p212 Runnable接口和Callable接口

p212 把Runnable对象包装为Callable对象

p213 FixedThreadPool详解

p214 使用无界队列作为工作队列对线程池产生的影响

p214 SingleThreadExecutor详解

p215 CachedThreadPool详解

p217 ScheduledThreadPoolExecutor的运行机制

p217 ScheduledThreadPoolExecutor的执行

p218 ScheduledThreadPoolExecutor相比ThreadPoolExecutor做的三个修改

p218 ScheduledThreadPoolExecutor的实现

p218 ScheduledFutureTask的三个成员变量(time、sequenceNumber、period)

p218 ScheduledThreadPoolExecutor中线程执行任务的步骤

P220 DelayQueue获取任务的三大步骤

P221 DelayQueue添加任务的三大步骤

p222 FutureTask简介

p222 FutureTask的三种状态

p222 FutureTask的使用

p224 FutureTask的实现

p227 级联唤醒