一、现代计算机物理内存模型
Java内存模型规定了JVM如何基于计算机内存工作。JVM就是一个完整的计算机模型因此这个模型中包含一个内存模型
现代计算机的内存与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统加入读写速度尽可能接近处理器运算速度的高速缓存(L1、L2、L3三级缓存容量依此增大,速度依此降低)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中这样处理器就无需等待缓慢的内存读写了。
基于高速缓存的存储交互很好地解决了处理器与内存的速度差异矛盾,但同是引入了一个新的问题:缓存一致性。在多处理器系统中,每个处理器都有自己的高速缓存,而他们又共享同一主存,如下图所示:多个处理器运算任务都涉及同一块主存,需要一种协议可以保障数据的一致性,这类协议有MSI、MESI、MOSI及Dragon Protocol等。总而言之,缓存一致性解决了缓存中的数据同步到主内存中数据一致性。
JMM物理内存模型1.并发编程需要解决的关键问题
- 线程通信
线程间以什么机制来交换信息 - 线程同步
程序用于控制不同线程间操作发生相对顺序的机制
2.java解决并发编程的方法
Java的并发采用的是共享内存模型。
-
线程通信
线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来进行隐式通信。
-
线程同步
程序必须显示地指定某个方法或某段代码需要在线程之间互斥。
3.JMM内存交互
Java内存模型定义了以下八种操作来完成,如下图所示:
JMM内存交互操作-
lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。
-
unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
-
read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用。
-
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
-
use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
-
assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
-
store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
-
write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。
JMM对8种内存交互操作制定的规则:
-
不允许read、load、store、write操作之一单独出现,也就是read操作后必须load,store操作后必须write。
-
不允许线程丢弃他最近的assign操作,即工作内存中的变量数据改变了之后,必须告知主存。
-
不允许线程将没有assign的数据从工作内存同步到主内存。
-
一个新的变量必须在主内存中诞生,不允许工作内存直接使用一个未被初始化的变量。就是对变量实施use、store操作之前,必须经过load和assign操作。
-
一个变量同一时间只能有一个线程对其进行lock操作。多次lock之后,必须执行相同次数unlock才可以解锁。
-
如果对一个变量进行lock操作,会清空所有工作内存中此变量的值。在执行引擎使用这个变量前,必须重新load或assign操作初始化变量的值。
-
如果一个变量没有被lock,就不能对其进行unlock操作。也不能unlock一个被其他线程锁住的变量。
-
一个线程对一个变量进行unlock操作之前,必须先把此变量同步回主内存。
4. 线程/工作内存/主内存 三者的关系
-
每个线程都有一个独立的工作内存,用于存储线程私有的数据
-
Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问
-
线程对变量的操作(读取赋值等)必须在工作内存中进行。(线程安全问题的根本原因)
-
主内存是在运行期间所有变量的存放区域,当工作内存是运行期间中某一线程独立私有的内存存放区域
-
线程间无法访问对方的工作内存空间,都是通过主内存交换来实现
-
主内存的变量在工作内存中的值是复制过去的副本,读写完成后刷新主内存,这意味着主内存如果发生了改变,工作内存并无法获得最新的结果
-
多个线程对一个共享变量进行修改时,都是对自己工作内存的副本进行操作,相互不可见。主内存最后得到的结果是不可预知的。
参考文章:
[(翻译)JVM——Java物理内存模型(JMM)及运行时内存模型]https://blog.csdn.net/cheya3213/article/details/100595911
网友评论