超详细的多线程知识点整理(带图)
2021-10-22 14:02:37 81 举报
AI智能生成
超详细的多线程知识点整理(带图),一图了解多线程并发知识点
作者其他创作
大纲/内容
并发计算机相关知识
CPU
内部结构
控制单元
地址寄存器
指令寄存器
指令计数器
运算单元
算术运算
逻辑运算
存储单元
CPU缓存结构
L1 Cache
L2 Cache
L3 Cache
缓存行
寄存器
存储器存储空间大小
存储器读取速度快慢
CPU读取存储器数据过程
局部性原理
时间局部性
空间局部性
CPU运行安全等级
ring0 内核态
ring1
ring2
ring3 用户态
操作系统内存管理
用户空间
内核空间
内核线程模型(KLT)
用户线程模型(ULT)
进程与线程
进程
线程
串行
并行
并发
线程的上下文切换
JAVA内存模型
主内存
工作内存
存储位置
实例对象中的成员方法
实例对象的成员变量
数据同步八大原子操作
lock(锁定)
unlock(解锁)
read(读取)
load(载入)
use(使用)
assign(赋值)
store(存储)
write(写入)
线程读取共享变量并操作的过程
并发三大特性
原子性
可见性
有序性
指令重排
数据依赖性
影响
volatile
两个规则
happens-before
定义
规则
程序顺序原则
锁规则
volatile规则
线程启动规则
线程终止规则
线程中断规则
传递性
对象终结规则
as-if-serial
volatile
作用
保证可见性
保证即时性
禁止指令重排优化
volatile禁止重排优化的实现
内存屏障
内存语义的实现
如何保证内部缓存数据的一致性
MESI缓存一致性协议
M 修改(Modified)
E 独享、互斥(Exclusive)
S 共享 (Shared)
I 无效 (Invalid)
MESI 协议状态切换过程
MESI优化及其带来的问题
总线锁
JAVA代码的执行流程图
锁
synchronized
synchronized原理
Monitor(监视器锁)
Minitor结构
WaitSet
EntryList
Owner
wait/notify原理
对象内存布局
对象头
实例数据
对齐填充
指针压缩
加锁方式
同步实例方法
同步类方法
同步代码块
锁的升级膨胀过程
偏向锁
轻量级锁
重量级锁
优化
自旋锁
锁粗化
锁消除
其他
减少上锁时间
减少锁的粒度
读写分离
CAS
什么是CAS?
底层实现
偏移量
CAS 流程
缺陷
ABA问题
ABA问题解决方式
实例
自旋时间过长,开销会很大
只能保证一个共享变量的原子操作
AQS框架
什么是 AQS?
AQS 特性
阻塞等待队列
共享/独占
独占
共享
公平/非公平
公平
非公平
可重入
允许中断
用途
内部结构
ReentrantLock
实现的必要条件
公平性与非公平性实现
内部结构
流程(底层原理图解)
队列
队列的类型
无限队列
有限队列
数据结构
阻塞队列 BlockingQueue
定义
应用场景
常见的阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
DelayQueue
共同点
API
添加元素
检索元素
ArrayBlockingQueue
实现
线程获取锁的条件
延迟队列 DelayQueue
定义
使用场景
生产者消费者模式
源码解析
并发工具类
Semaphore
定义及作用
使用场景
常用API
使用实例
原理图解
CountDownLatch
定义及作用
使用场景
开始执行前等待n个线程完成各自任务
实现最大的并行性
死锁检测
原理
常用API
使用实例
CyclicBarrier
定义
常用API
应用场景
模拟并发
多线程计算数据,最后合并计算结果
使用实例
Executors
原子操作
原子操作的实现
处理器
自动保证
总线锁
缓存锁定
Java
锁
循环 CAS
Atominc 原子包
基本类
AtomicInteger 为例部分部分API
源码分析
数组类型
AtomicIntegerArray为例部分API
注意事项
属性原子修改器(Updater)
引用类型
AtomicStampedReference
Unsafe 魔法类
定义及作用
获取Unsafe实例的方法
反射
getUnsafe()
用途
内存操作
常用API
为什么要使用堆外内存
优化垃圾回收
提升程序I/O操作的性能
使用堆外内存注意事项
典型应用之DirectByteBuffer
CAS相关操作
线程调度
常用API
典型应用
park/unpark线程阻塞唤醒
跨方法加锁
内存屏障
并发集合
HashMap
JDK1.8以前
数据结构
不足
JDK1.8
数据结构
链表转红黑树的条件
相较于JDK1.6的改进
HashMap容量
限制
默认容量
扩容
JDK1.8以前
JDK1.8
HashMap保证有序性的扩展
单线程:TreeMap
多线程:跳表
多线程环境下的问题
数据丢失
死锁(JDK < 1.8)
HashTable
ConcurrentHashMap
JDK < 1.8
数据结构
Segment 数组
结构图
JDK1.8
数据结构
结构图
相较于JDK1.7的优化
CopyOnWrite
核心思想
适用场景
特点
读写过程图解
线程
线程
进程
线程
进程与线程的区别
临界区与竞态条件
临界区Critical Section
竞态条件Race Condition
创建线程的几种方式
实现Runnable接口
直接继承 Thread
FutureTask 配合 Thread
常见方法
STATIC
非STATIC
过时的方法
sleep和yield的区别
sleep与wait的区别
Park与UnPark
设计模式保护性暂停
作用
要点
join源码应用
线程优先级
如何正确终止线程
两阶段终止模式(取代Stop等过时方法)
实现
守护线程
生命状态
初始状态
可运行(就绪)状态
运行状态
阻塞状态
结束状态
六种状态
协程
线程池
作用
适用场景
为什么要用线程池
Executor框架
继承体系
重要API
五种状态
RUNNING
SHUTDOWN
STOP
TIDYING
TERMINATED
七大参数
核心线程数
最大线程数
线程最大空闲时间
时间单位
等待(阻塞)队列
创建线程的工厂
拒绝策略
AbortPolicy
CallerRunsPolicy
DiscardOldestPolicy
DiscardPolicy
自定义策略
线程池监控方法
参数设置(参考)
CPU 密集型
I/O密集型
工作流程
线程池工作生命周期
阻塞队列的作用
为什么先添加阻塞队列而不是先创建最大线程
一段话总结线程池原理
定时任务线程池
Timer
类关系
结构
任务的提交
schedule
scheduledAtFixedRate
scheduledWithFixedDelay
工作线程的执行过程
其他
ThreadLocal
使用场景
使用实例及结果分析
结构及关系
内存泄漏问题
注意点
Callable
Future
定义
常用场景
CPU(计算)密集场景
大数据量处理
远程方法调用
API
使用实例及注释
CompletableFuture
JDK1.8 版本的类
API及使用方法
创建异步对象
计算结果完成后的回调方法
线程串行化方法
任务合并
合并两个任务 - 两个任务都要完成
合并两个任务 - 两个任务完成一个
合并多个任务
Future继承过来的方法
应用场景
异步编排
Future/Promise 异步编程模式
ForkJoin
核心思想:分治
使用场景
使用
Disruptor
设计原理
数据结构
等待策略
写数据流程
使用
0 条评论
下一页