本文共 1684 字,大约阅读时间需要 5 分钟。
计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必会涉及到数据的读取和写入。
由于在程序运行过程中,临时数据是存放在主存(物理内存)中的,这时就存在一个问题,由于CPU执行指令的速度很快,而从内存读取和写入数据的过程与其相比速度要慢得多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。
因此CPU中就有了高速缓存。当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存中,当CPU进行计算时就可以直接从它的高速缓存中读取和写入数据,运算结束之后,再将高速缓存中的数据刷新到主存当中去。
在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。
JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程读/写共享变量的副本。
如果线程A与线程B之间要通信的话,必须要经历下面2个步骤。
原子性:一个操作或多个操作,要么全部执行并且执行过程中不会被任何因素打断,要么就不执行。
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值
有序性:程序执行的顺序按照代码的先后顺序执行。
指令重排序:一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的(顺序不一致,但结果一致)。重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 ->最终执行的指令
保证有序性的方法:
转载地址:http://zlmkz.baihongyu.com/