Java 内存模型结构

在这里插入图片描述
1、主内存

主要存储的是Java实例对象,所有线程创建的 实例对象都存放在主存中,不管该实例对象时成员边浪还是方法中的本地变量,当然还包含共享的类信息、常量、静态 变量。由于是共享数据区域,多条线程对同一个变量进行访问可能会发生线程安全问题。

2、工作内存

(1) 主要存储当前方法的所有本地变量(工作内存中存储着主内存中的变量副本拷贝),每个线程只能访问自己的工作内存,即线程中的本地变量对其他线程是不可见的,就算是两个线程执行的是同一段代码,它们也会各自在自己的工作内存中创建属于当前线程的本地变量,当然也包括了字节码行号指示器、相关Native方法的信息。

(2) 由于工作内存是每个线程的私有数据,线程间无法相互访问工作内存,因此存储在工作内存的数据不存在线程安全问题。

(3) 根据JVM 虚拟机规范主内存与工作内存的数据存储类型以及操作方式,对于一个实例对象中的成员方法而言,如果方法中包含本地变量是基本类型,将直接存储在工作内存的栈帧结构中,但倘若本地变量是引用类型,那么该变量的引用会存储在工作内存的栈帧中,而对象实例将存储在主内存(共享内存区域,堆中)。

(4) 但对于实例对象的成员变量,不管它是基本数据类型或者包装类型还是引用类型,都会存储在堆中

(5) 至于static变量以及类本身相关信息将会存储在主内存中。

(6) 在主内存中的实例对象可以被多线程共享,倘若两个线程同时调用了同一对象的同一方法,那么两条线程会将要操作的数据拷贝一份到自己的工作内存中,执行完成操作后才刷新到主内存中。

史上最全的并发编程脑图:https://www.processon.com/view/5b1f1ad7e4b03f9d251c06e5#map

猜你喜欢

转载自blog.csdn.net/fd2025/article/details/108326378