Java 并发编程实战-并发编程bug源头
此文章为8月Day02学习笔记,内容来源于极客时间《Java 并发编程实战》
并发幕后的故事
CPU与内存 (天上一天地下一年)
内存与I/O 设备 (天上一天地下十年)
CPU>内存>IO设备
根据木桶原理,程序的短板是读写 I/O 设备
问题的本质
这三者速度差异
为了优化上面的问题合理利用CPU 高性能、平衡这三者的差异做出了如下优化
- CPU 增加了缓存,以均衡与内存的速度差异;
- 操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异;
- 编译程序优化指令执行次序,使得缓存能够得到更加合理地利用。
在享受这些优化的同时也随之带来了一系列的问题:
1. 缓存导致的可见性问题
可见性:一个线程对共享变量的修改,另一个线程能立刻看到
cpu缓存与内存关系图
多核 CPU 的缓存与内存关系图
2. 线程切换带来的原子性问题
原子性:我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性
static Singleton instance;
static Singleton getInstance(){
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
3. 编译优化带来的有序性问题
有序性 有序性问题的本质是编译器对高级编程语句的顺序进行了调整
推荐文章
【final】
【闲话高并发的那些神话,看京东架构师如何把它拉下神坛】
【可见性 原子性 有序性】
www.zhihu.com/question/36… blog.csdn.net/javazejian/… 【系列文章】 www.blogjava.net/xylz/archiv…