zoukankan      html  css  js  c++  java
  • java内存模型

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

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

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

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

      

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

  • 相关阅读:
    Git之GitFlow工作流
    auth
    rbac
    修改或删除windows上的git用户凭证信息
    Linux之shell备份数据库
    解决Navicat 连接服务器数据库报10060问题
    PHP框架学习思路
    shell之hello world
    Linux命令大全
    PHP 各个版本的区别
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/10336420.html
Copyright © 2011-2022 走看看