死磕JVM(二)内存模型

目录

1 Java内存模型概述

1.1 主内存和工作内存

1.2 主内存和工作内存的交互操作


死磕JVM(一)内存区域  https://blog.csdn.net/u012133048/article/details/85344025

死磕JVM(二)内存模型  https://blog.csdn.net/u012133048/article/details/87886352

死磕JVM(三)内存溢出 https://blog.csdn.net/u012133048/article/details/87891398

死磕JVM(四) 垃圾回收机制 https://blog.csdn.net/u012133048/article/details/85413539

死磕JVM(五)对象的创建 https://blog.csdn.net/u012133048/article/details/87938452

死磕JVM(六) 类加载机制 https://blog.csdn.net/u012133048/article/details/85378148

死磕JVM (七) 锁优化 https://blog.csdn.net/u012133048/article/details/85490843

死磕JVM (八) 总结 https://blog.csdn.net/u012133048/article/details/88069289

1 Java内存模型概述

1.1 讨论对象

java内存模型的主要目标是定义各个变量的访问规则,而这里有主内存和工作内存之分,首先可以确定这些变量都是多线程共享的,所以这些变量不包括局部变量和方法参数,因为这些都是私有的,不会被共享。

1.1 主内存和工作内存

Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图

需要注意的是,JMM与Java内存区域的划分是不同的概念层次。JMM与Java内存区域唯一相似点,都存在共享数据区域和私有数据区域,在JMM中主内存属于共享数据区域,从某个程度上讲应该包括了堆和方法区,而工作内存数据线程私有数据区域,从某个程度上讲则应该包括程序计数器、虚拟机栈以及本地方法栈。或许在某些地方,我们可能会看见主内存被描述为堆内存,工作内存被称为线程栈,实际上他们表达的都是同一个含义。关于JMM中的主内存和工作内存说明如下。

1.2 主内存和工作内存的交互操作

交互操作无非就是这两个问题:

1、如何将主内存拷贝到工作内存中;

2、如何从工作内存中同步回主内存。

java内存模型中定义了8种操作来完成,而且每种操作都是原子操作,不可再分。

(1)lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态
(2)unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
(3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
(4)load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
(5)use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎
(6)assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量
(7)store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
(8)write(写入):作用于主内存的变量,它把store操作从工作内存中的一个变量的值传送到主内存的变量中
如果要把一个变量从主内存中复制到工作内存中,就需要按顺序地执行read和load操作,如果把变量从工作内存中同步到主内存中,就需要按顺序地执行store和write操作。但Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行。

链接:死磕JVM(一)内存区域https://blog.csdn.net/u012133048/article/details/85344025

猜你喜欢

转载自blog.csdn.net/u012133048/article/details/87886352
今日推荐