Java 并发编程实战-并发编程bug源头

150 阅读2分钟

Java 并发编程实战-并发编程bug源头

此文章为8月Day02学习笔记,内容来源于极客时间《Java 并发编程实战》

并发幕后的故事

​CPU与内存 (天上一天地下一年)

​内存与I/O 设备 (天上一天地下十年)

CPU>内存>IO设备

根据木桶原理,程序的短板是读写 I/O 设备

问题的本质

这三者速度差异


为了优化上面的问题合理利用CPU 高性能、平衡这三者的差异做出了如下优化

  1. CPU 增加了缓存,以均衡与内存的速度差异;
  2. 操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异;
  3. 编译程序优化指令执行次序,使得缓存能够得到更加合理地利用。

在享受这些优化的同时也随之带来了一系列的问题:

1. 缓存导致的可见性问题

可见性:一个线程对共享变量的修改,另一个线程能立刻看到 image.png

cpu缓存与内存关系图

image.png

多核 CPU 的缓存与内存关系图

2. 线程切换带来的原子性问题

原子性:我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性

  static Singleton instance;
  static Singleton getInstance(){
    if (instance == null) {
      synchronized(Singleton.class) {
        if (instance == null)
          instance = new Singleton();
        }
    }
    return instance;
  }
}

image.png

image.png

3. 编译优化带来的有序性问题

有序性 有序性问题的本质是编译器对高级编程语句的顺序进行了调整

image.png

推荐文章

【final】

www.infoq.cn/article/jav…

【闲话高并发的那些神话,看京东架构师如何把它拉下神坛】

www.lmlphp.com/user/346/ar…

【可见性 原子性 有序性】

www.zhihu.com/question/36… blog.csdn.net/javazejian/… 【系列文章】 www.blogjava.net/xylz/archiv…