现在的位置: 首页 > 综合 > 正文

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

2017年11月09日 ⁄ 综合 ⁄ 共 1339字 ⁄ 字号 评论关闭

最近在准备并发基础的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.锁的优化,比如控制锁的粒度,锁分段,识别和解决死锁/活锁等

理解了可见性,有序性,原子性的原理和底层实现之后,需要理解一下并发场景下的一些通用的设计思路,高性能服务器的设计思路

1. 如何安全发布一个对象

2. 线程封闭技术,不可变对象的使用

3. 控制锁的粒度,锁分段,CopyOnWrite等优化

4. 生产者消费模型

5. 线程池的设计和实现

6. 同步操作转异步操作

7. 5种IO模型的理解

8. 高性能服务器的线程模型设计, reactor / proactor

9. 使用高效的网络传输 -- NIO的原理,设计和实现,比如epoll / selector / pull, Buffer的使用

10. 多进程监听一个端口 vs  单进程监听一个端口,  nginx的惊群问题分析

抱歉!评论已关闭.