聊聊高并发(三十七)整理一下并发基础中的一些知识点

近期在准备并发基础的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的惊群问题分析


原文地址:https://www.cnblogs.com/zfyouxi/p/4344048.html