前言
读过笔者之前的一篇文章https://mp.weixin.qq.com/s/iyXN4WyGAV_J4d8zeiG7yA, 我们知道了由于计算机为了充分利用CPU的高性能,以及各个硬件 存取速度巨大的差异带来的一系列问题
- 为了充分压榨CPU的性能,CPU 会对指令乱序执行或者语言的编译器会指令重排,让CPU一直工作不停歇,但同时会导致有序性问题。
- 为了平衡CPU的寄存器和内存的速度差异,计算机的CPU 增加了高速缓存,但同时导致了 可见性问题
- 为了平衡CPU 与 I/O 设备的速度差异,操作系统增加了进程、线程概念,以分时复用 CPU,但同时导致了原子性问题。
Java 是最早尝试提供内存模型的编程语言。由于Java 语言是跨平台的,另外各个操作系统总存在一些差异,Java在物理机器的基础上抽象出一个 内存模型(JMM),来简化和管理并发程序。我们都知道Java并发的三大特性:原子性,可见性,有序性
- 原子性指的是一个不可以被分割的操作,即这个操作在执行过程中不能被中断,要么全部不执行,要么全部执行。且一旦开始执行,不会被其他线程打断。
- 可见性 指的是一个线程修改了共享变量后,其他线程能立即感知这个变量被修改。
- 有序性 指程序按照代码的先后顺序执行。 在Java内存模型中,为了提升效率是允许编译器和处理器对指令进行重排序,当然重排序不