近期在准备并发基础的PPT,想到了一些知识点,记录下来以后也能够做个參考。大部分的知识点在之前的博客中都多少涉及到了
这里的并发基础指的是单机多处理器的情况下的一些并发问题,不涉及到分布式环境下的并发问题。
并发基础主要解决的是可见性,有序性和原子性的问题,让不可控的进程/线程变得能够预測,能够控制行为。
Java解决可见性/有序性的主要技术是通过Java内存模型来解决的。Java内存模型这个域里面有这些知识点
1. 可见性问题的根源 -- CPU写操作的延迟
2. 造成写操作延迟的原因主要是快速缓存的存在,理解缓存的原理,局部性原理,快速缓存的原理等
3. 解决可见性问题的通用方法 -- 确定一致性需求。有多种一致性模型:线性一致性,顺序一致性,因果一致性,处理器一致性,弱一致性,释放一致性,进入一致性等等
4. 底层硬件提供了实现一致性需求的能力 -- 内存屏障,比方X86的mfence, sfence, lfence, Lock前缀等等,理解Lock前缀的语义
5. 底层硬件提供了缓存一致性协议来提供底层同步缓存的能力,注意总线的相互排斥性,缓存一致性流量等
6. Java内存模型是语义级的内存模型,主要是屏蔽底层硬件提供的内存模型能力的差异,提供了一系列的Java同步操作语法,制定了Happens-before规则
7. 理解volatile, synchronized, CAS等操作的底层实现原理
8. 理解Happens-before规则描写叙述的是可见性的问题
9. 理解指令重排序的概念,理解有序性
Java解决原子性的问题主要是通过锁/相互排斥来实现的,锁这个问题域里面有这些知识点
1. 锁的原理,饥饿,公平,自旋,堵塞,管程,条件队列等等概念
2. 并发编程的三个重要特性:可见性,有序性和原子性。锁解决的问题域
3. 线程在各个层面的状态控制,JVM中怎样实现线程,操作系统怎样实现线程,线程调度
4. 自旋 VS 堵塞
5. 多种经典的自旋锁的实现,比方TAS/TTAS/CLH/MCS lock
6. 读写锁,可重入锁,时限锁的原理和实现
7. Object.wait(), Object.notify, Condition等条件队列操作的底层原理
8. sun.misc.Unsafe类提供的同步能力
9. Java并发包中的AQS同步器的设计和重点实现
10. Java并发包中的Semaphore, CountDownLatch, CyclicBarrier等同步器的实现
11. 一些无锁的数据结构的设计思路及实现,比方无锁队列
12.锁的优化,比方控制锁的粒度,锁分段,识别和解决死锁/活锁等
理解了可见性,有序性,原子性的原理和底层实现之后,须要理解一下并发场景下的一些通用的设计思路,高性能server的设计思路
1. 怎样安全公布一个对象
2. 线程封闭技术,不可变对象的使用
3. 控制锁的粒度,锁分段,CopyOnWrite等优化
4. 生产者消费模型
5. 线程池的设计和实现
6. 同步操作转异步操作
7. 5种IO模型的理解
8. 高性能server的线程模型设计, reactor / proactor
9. 使用高效的网络传输 -- NIO的原理,设计和实现,比方epoll / selector / pull, Buffer的使用
10. 多进程监听一个port vs 单进程监听一个port, nginx的惊群问题分析