一、Java内存模型

此处讨论的Java内存模型与Java虚拟机中的运行时内存区域不是从同一个角度讨论的,JVM运行区域是根据内存的功能和作用进行划分的,而Java内存模型是从多线程角度抽象出来的一个逻辑模型,不能将两者一一对应。

1、物理机的内存模型

由于存储设备和和处理器的的运算速度存在几个数量级的差距,因此,现代计算机系统中加入了高速缓存来解决这个问题:将需要用到的数据从内存中复制一份到高速缓存中,处理器从高速缓存中存取数据,再将计算后的数据从高速缓存中写回内存,这样就可以提高处理器存取数据的速度。

 

 但是这也带来了新的问题,由于每个处理器都有自己的高速缓存,当多个处理器同时处理内存中同一份区域的数据时,这些数据就会在各个处理器的高速缓存中同时存在多份复制的数据。各个处理器都对各自缓存中的数据进行了修改,最后同步回主内存中时,到底应该以哪一份数据为准就成为了一个问题,这个问题也叫做缓存一致性问题。

为了解决缓存一致性问题,提出了缓存一致性协议。只要各个处理器在访问缓存时都遵循缓存一致性协议,就能避免缓存一致性问题。

2、Java的内存模型

为了屏蔽各种硬件和操作系统的内存访问差异,JVM中也定义了一种Java内存模型。Java内存模型与物理机内存模型类似,其主要目标是定义程序中各个变量的访问规则。这里的变量与Java编程中提到的变量不同,这里的变量指的是多个线程共享的变量,包括包括实例字段、静态字段和构成数组对象的元素,而线程私有的变量,如局部变量和方法参数不在此列。

Java内存模型规定,所有的变量都存储在主内存(类比物理机内存模型中的主内存)中,每条线程拥有自己的工作内存(类比高速缓存),线程的工作内存中保存了被该线程使用到的变量的主内存中的副本拷贝。线程对变量的读写操作都是在自己的工作内存中进行的,而不能直接读写主内存中的变量,更不能读写其他线程的工作内存。

 

 

 

Guess you like

Origin blog.csdn.net/sun_lm/article/details/119979437