本文共 1096 字,大约阅读时间需要 3 分钟。
Java内存模型(Java Memory Model,JMM)是Java虚拟机规范中定义的为了屏蔽掉各种硬件和操作系统间的内存访问差异,以实现Java程序在各平台下访问内存的一致性个定义的一种内存模型。
Java内存模型的主要目的是定义内存中各个变量的访问规则,也就是在虚拟机中将变量存入内存和从内存中访问变量的底层细节。
需要注意的一点是:这里的变量指的是实例字段、静态变量和数组内容,不包含方法的参数和局部变量,由于方法的参数和局部变量是线程私有的,所以不存在竞争现象。
Java内存模型定义了所有的变量都存储在主内存中,每个线程都有自己的工作内存,而工作内存中的数据其实都是从主内存中拷贝而来的副本。线程对变量的所有操作都是在工作内存中进行的,而不能够直接对主内存中的数据进行操作,除非在变量前加上volatile关键字。
不同的线程之间无法访问其他线程的工作内存中的数据,线程间数据的传递只能依靠主内存来进行。
以下是工作内存和主内存间的关系图:
关于工作内存和主内存的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存,Java内存模型定义了以下八种操作来完成。
lock(锁定):作用于主内存,将主内存中的一个变量锁定,变成线程独有。
unlock(解锁):作用于主内存,将一个处于锁状态的变量释放出来,以便于其他线程使用。
read(读取):作用于主内存,把一个变量从主内存传输到线程的工作内存,以便后面的load动作使用。
load(载入):作用于工作内存,把一个从主内存读取的变量的值,存入工作内存中的变量副本。
use(使用):作用于工作内存,把一个工作内存的值传递给执行引擎,每当遇到使用一个变量的字节码指令的时候将执行这个操作。
assign(赋值):作用于工作内存,执行引擎将一个值赋值给工作内存中的变量。
store(存储):作用于工作内存,把一个工作内存的值传输给主内存,以便后面的write操作。
write(写入)作用于主内存,把一个从工作内存获取的值放入主内存。
在程序执行的时候,为了提高性能编译器和处理器会堆指令进行重排序,重排序分成以下三种。
(1)编译器优化的重排序。编译器在不改变单线程程序语义放入前提下,可以重新安排语句的执行顺序。
(2)指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 (3)内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。转载地址:http://vukgj.baihongyu.com/