一、硬件的效率与一致性
我们的程序要运行,离不开CPU、内存、IO设备,但是他们三者之间的执行速度是有差异的。
CPU 的执行速度最快,内存的速度次之,IO设备的速度最慢。
为什么会有内存缓存?
CPU 执行一条指令非常快,但是他从内存中读取某个数据时,就需要等待很长的时间,为了弥补速度上的巨大差异,让 CPU 不被内存拖垮,所以在
CPU 上增加了缓存。
当 CPU 请求内存中的数据时,会先查看缓存中是否有该数据,如果存在则直接返回该数据;如果不存在,则要先把内存中的数据载入缓存,然后再返回给 CPU。
所以我们的程序在执行时,往往就需要将数据从内存中读取出来载入到缓存中,然后进行处理,处理完成之后再将数据回写到内存中去。
除此以外,现代的计算机都是多CPU、多核的,程序也不再只运行在单一线程中,而是有多个线程在运行。
每个线程都会维护一份自己的内存副本,也就是 CPU 缓存,所以线程之间一定会存在数据一致性的问题。
一般来说,导致并发问题的根源不外乎以下这几个原因:
可见性:一个线程对共享变量的修改,另一个线程是否可见?
原子性:一个或多个操作在 CPU 执行的过程中是否会被中断?
有序性:程序编译后的指令是否会按照代码原本的顺序执行?
内存模型:在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。
二、Java 内存模型
这里的主内存、工作内存和前面学的Java内存区域中的 Java 堆、栈、方法区等并不是同一个层次的内存划分,两者基本没有关系
三、内存间交互操作
这8种内存访问操作以及上述规则限定,再加上稍后介绍的对 volatile 的一些特殊规定,就已经完全确定了 Java 程序中哪些内存访问操作在并发下是安全的。
四、对于long 和 double 型变量的特殊规则
五、先行发生原则
结合学习:内存模型 JVM