博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存模型
阅读量:320 次
发布时间:2019-03-04

本文共 705 字,大约阅读时间需要 2 分钟。

    对于编程语言而言,最终编译的指令是要和具体的硬件打交道的,但是硬件规格是不同的,而编程语言的语义是唯一的,所以需要一个中间层来兼容多种硬件和唯一语义之间的关系。

    对于C/C++而言,这个中间层是编译器来实现的,当然C++11之前是不提供内存模型的,C++11之后才有,对于Java而言,这个中间层当然是由JVM实现的。

    编程语言在内存模型上的规定涉及的主要是对内存的存取特性,特别是多CPU、多核心等不同规格硬件下的内存存取特性,内存模型的建立和CPU等硬件高度相关,内存模型的发展也是一个历史过程,不是一蹴而就的。编译型语言C/C++提供的内存模型比Java要更偏底层,粒度更细,这里只讲Java内存模型。

    Java内存模型定义在JLS中有提到,但是只是提到了线程和内存之间那种抽象的关系,规定了程序合法的执行轨迹,对于具体实现没做过多的规定,这给虚拟机实现供了极大的自由空间,可以执行大量的代码转换,包括操作的重新排序和删除不必要的同步。下面我们讨论的内存模型都是具体的虚拟机实现特性。

    Java中,能被所有线程共享的内存称为共享内存或堆内存,所有实例的域,静态域,数组元素就在堆内存中,局部变量,函数参数,异常处理参数等不在内存模型的影响范围。冲突产生在对共享区域的变量的操作(读或写),至少有写操作。本地内存中存储了当前线程读写共享变量的副本,本地内存是个逻辑概念,对程序员完全透明,但确实存在,内存模型主要操作的对象如下图:

可以明显地看到不同线程对共享变量的同时读写,内存模型就是要保证这种情况下的数据度读写正确性。在发生这个场景之前,我们的代码就是经过编译器编译的,编译器会对代码指令进行重排序,

你可能感兴趣的文章