Java内存模型(即JavaMemoryModel,简称JMM)本身是一种抽象的概念,实际上并不存在。它描述了一组规则或规范,通过这些规则或规范定义了程序中各种变量(包括实例字段,静态字段和构成数组对象的元素)的访问方法。
Java内存模型的主要目标是定义程序中每个变量的访问规则,即如何在虚拟机中的内存中存储和删除变量。这里的变量不包括局部变量和方法参数,因为它们是线程专用的,并且不会共享,因此不存在竞争问题。由于JVM运行程序的实体是一个线程,因此在创建每个线程时,JVM都会为其创建一个工作内存(在某些地方称为堆栈空间)以存储线程专用数据,并且Java内存模型规定所有变量存储在主内存中,主内存是一个共享内存区域,所有线程都可以访问该区域,但是线程对变量的操作(读取分配等)必须在工作内存中执行。首先,必须将变量从主内存复制到其自己的工作内存空间,然后对变量进行操作。操作完成后,变量将被写回到主存储器。主存储器中的变量不能直接操作。主存储器中变量的副本存储在工作存储器中。如前所述,工作内存用于每个线程。因此,不同的线程无法访问彼此的工作内存。线程之间的通信(值传递)必须通过主存储器完成。下图显示了线程,主内存和工作内存之间的关系。
在弄清了主存储器和工作存储器之后,让我们看一下主存储器和工作存储器的数据存储类型和操作模式。根据虚拟机规范,对于实例对象中的成员方法,如果该方法包含局部变量,则它是基本数据。将存储类型(布尔,字节,short,char,int,long,float,double)直接在工作存储器的框架堆栈结构中,但是如果局部变量是引用类型,则变量的引用将存储在功能存储器中。在框架堆栈中,对象实例将存储在主存储器中(共享数据区,堆)。但是对于实例对象的成员变量,无论是基本数据类型还是打包类型(Integer,Double等)还是引用类型,它都将存储在堆区域中。至于类本身的静态变量和相关信息,则将其存储在主存储器中。应该注意的是,主存储器中的实例对象可以被多个线程共享。如果两个线程同时调用同一对象的相同方法,则两个线程会将要操作的数据复制到它们自己的工作内存中。在操作完成后,将刷新主存储器。
推荐阅读:java架构师培训:java最佳测试框架JBehave的基本介绍
如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1160405674,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!