hugo/content/posts/1.Learning/A3.Reflections/Java/java-jmm.md
2026-03-18 22:36:05 +08:00

28 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Java内存模型"
date: 2022-06-02T10:21:01+08:00
tags: ["java"]
categories: ["Learning", "Reflections"]
---
# Java内存模型JMM
## 概念
> Java内存模型Java Memory ModelJMM用于屏蔽掉各种硬件和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的并发效果JMM规范了Java虚拟机与计算机内存是如何协同工作的规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值以及在必须时如何同步的访问共享变量。
>
> Java内存模型不仅仅是JVM内存分区调用栈和本地变量存放在线程栈上对象存放在堆上。
## 堆栈存放规则
![JMM-ae7349b6](https://image.shijinping.cn/picgo/202206021021081.jpg)
1. 一个本地变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上。
2. 一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。
3. 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量仍然存放在线程栈上,即使这些方法所属的对象存放在堆上。
4. 一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。
5. 静态成员变量跟随着类定义一起也存放在堆上。
6. 存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量,但是每一个线程都拥有这个成员变量的私有拷贝。
## 资料地址
1. [EnjoyMoving](https://zhuanlan.zhihu.com/p/29881777)