java内存模型

  之前聊过java内存区域(参见java内存区域),还有一个叫java内存模型(JMM,Java Memory Model)的,都是基于JVM特有的概念,名字看起很像,说的却是两码事。内存区域是JVM管理内存的手段,通过划分区域方便管理;而内存模型是JVM定义的一种规范,定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。前者是横向的,告诉我们内存这个地盘怎么瓜分;后者是一种过程的规则,用来告诉我们虚拟机中怎么把变量存储到内存,又是怎么从内存中取出来的。需要注意的是,这里的变量特指程序员理解的全局变量。

  要知道啥是JMM,就得先明白两个概念:主内存和工作内存。我们可以借助java内存区域来理解内存模型:主内存可以理解为java内存区域里的java堆中的对象实例数据,它是线程共享的,而工作内存就是虚拟机栈,它是线程私有的。主内存是虚拟机的,所有线程均可以使用,而工作内存是给每个线程自己特有的,别的线程无法使用,而且工作内存中保存了该线程用到的主内存中的变量的拷贝副本。明白了这两个内存的不同点之后,接下来就好理解了。那么究竟JVM是怎么规定变量的存储和取出的呢?

  既然主内存是共享内存区域,那么理应让所有线程均可访问,但线程对变量的所有操作(读取、赋值等),必须在工作内存中进行。首先要将变量从主内存拷贝的自己的工作内存空间(变量:主内存 -> 工作内存,在工作内存中成了拷贝的副本),然后线程对变量的拷贝副本进行操作,操作完成后再由工作内存将变量写回主内存。线程本身不能直接读写主内存中的变量。

  不同的线程之间也无法彼此互相访问工作内存的变量,而需要借助主内存这个中间人来交流。线程、工作内存、主内存的关系图如下:

  

  关于主内存与工作内存之间具体的交互协议这里就不细说了。

posted on 2019-01-29 23:54  不想下火车的人  阅读(143)  评论(0编辑  收藏  举报

导航