在java中提到内存很多人都会想到jvm,本篇要说的内存模型也会被误解成是这个。其实,这也是面试中比较容易出错的一个考点,内存模型的简称是jmm,相信如果是以英文名称展现还是不容易混淆的。下面我们就Java内存模型的概念进行讲解,同时帮助大家做一个它和jvm的区分。
1、概念
Java内存模型(Java Main Memory简称JMM)是一个抽象概念,和计算机的内存模型有很多相似的地方。JMM主要包括线程、工作内存、主内存三者来交互,其中工作内存可以类比计算的高速缓存,不过线程间工作内存是互相独立的;主内存类比计算机的主内存,线程间变量值传递主要是通过主内存来完成的。同时JMM也有优化代码执行顺序的指令重排序。简单的说就是代码的编写顺序不一定就是代码的执行顺序。
2、JMM与JVM的区分
Java内存模型看上去和Java内存结构(JVM内存结构)差不多,很多人会误以为两者是一回事儿,这也就导致面试过程中经常答非所为。
Java堆和方法区的区域是多个线程共享的数据区域。也就是说,多个线程可能可以操作保存在堆或者方法区中的同一个数据。这也就是我们常说的“Java的线程间通过共享内存进行通信”。
Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。JSR-133: Java Memory Model and Thread Specification中描述了,JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。
那么,简单总结下,Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。
以上就是java中内存模型的有关介绍,本篇侧重于基础的理论分享,大家可以重点对jmm和jvm进行区分,日后学习时也能对这两个概念更加明确。