写写Java 内存模型

简介: JMM 并发编程必须要理解的重中之重

概述

最近朋友面试,让我帮忙模拟下面试。在这个过程中,突然想到了Java 内存模型,顺便问了一下,朋友的回答是JVM 的运行时数据区的内存分布。虽然我知道这不是想要的答案,但我不知道Java 内存模型是什么,虽然不知道也不是不能工作。但是谁让面试卷呢?


因为一些不可控的原因,我也要找工作了,就赶紧把这个不会的内容搞清楚吧。


由于Amdahl 定律代替摩尔定律成为计算机性能发展源动力,导致并发处理的广泛应用。现在我们的cpu 都是多processor 的,也是遵照了Amdahl 定律。用多个处理器来提升pc 的运行效率。当然,我们有多个核心执行代码,而内存只有一块儿,那就需要提升自己并发编程的能力,让软件更好的适用硬件提升效率。


当多个processor 处理同一个共享内存资源时,Java 是如何处理的呢?

image.jpeg

为此Java 提出了内存模型 JMM


JMM定义

JMM 属于语言级的内存模型,它确保在不同的编译器和不同的处理平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。


image.jpeg


Java 的并发采用的是共享内存模型,Java 线程之间的通信总是隐式进行的,整个通信过程对我们是完全透明的。Java 线程之间的通信由Java 内存模型控制,JMM 决定一个线程共享变来给你的写入何时对另一个线程可见。JMM 通过控制主内存与每个线程的本地内存之间的交互,来为我们提供内存可见性保证。


主内存与工作内存交互的8个步骤

◆lock(锁定):作用于主内存的变量,把一个变量标识为一条线

程独占状态

◆ unlock〔解锁):作用于主内存的变量,把一个处于锁定状态

的变量释放出来,释放后的变量才可以被其他线程锁定

◆read(读取):作用于主内存的变量,把一个变量值从主内存

传输到线程的工作内存中,以便随后的load动作使用

◆load(载入):作用于工作内存的变量,它把read操作从主内

存中得到的变量值放入工作内存的变量副本中

◆use(使用):作用于工作内存的变量,把工作内存中的一个变

量值传递给执行引擎

◆ assign(赋值):作用于工作内存的变量,它把一个从执行引

擎接收到的值赋值给工作內存的变量

◆ store(存储):作用于工作内存的变量,把工作内存中的一个

变量的值传送到主内存中,以便随后的 write的操作

◆ write(写入):作用于主内存的变量,它把 store操作从工作内

存中一个变量的值传送到主内存的变量中


一个主内存中的共享变量想要到cpu 被processor 操作必须经过 read load use 这三个步骤并不具有原子性,这也就是为什么在并发场景下,没有合适的同步机制会出现错误的原因。这也就是程序员不得不理解JMM 的重要原因。


happens-before简介

在JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before 关系。这里提到的两个操作即可以是在同一个线程之内,也可以是不同线程之间。


简单的写了下自己有关JMM 的理解,但JMM 并不仅仅是上面的内容,还有对锁,volitale ,final 等特殊的处理;接下来还会持续更新!

相关文章
|
19天前
|
存储 Java 测试技术
滚雪球学Java(18):解密JavaSE中的堆栈:你真的了解Java内存吗?
【4月更文挑战第7天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
43 1
滚雪球学Java(18):解密JavaSE中的堆栈:你真的了解Java内存吗?
|
11天前
|
存储 Java
深入理解Java虚拟机:JVM内存模型
【4月更文挑战第30天】本文将详细解析Java虚拟机(JVM)的内存模型,包括堆、栈、方法区等部分,并探讨它们在Java程序运行过程中的作用。通过对JVM内存模型的深入理解,可以帮助我们更好地编写高效的Java代码,避免内存溢出等问题。
|
14天前
|
算法 Java Go
Go vs Java:内存管理与垃圾回收机制对比
对比了Go和Java的内存管理与垃圾回收机制。Java依赖JVM自动管理内存,使用堆栈内存并采用多种垃圾回收算法,如标记-清除和分代收集。Go则提供更多的手动控制,内存分配与释放由分配器和垃圾回收器协同完成,使用三色标记算法并发回收。示例展示了Java中对象自动创建和销毁,而Go中开发者需注意内存泄漏。选择语言应根据项目需求和技术栈来决定。
|
3天前
|
存储 算法 Java
了解Java内存管理与垃圾回收机制
了解Java内存管理与垃圾回收机制
6 0
|
12天前
|
存储 机器学习/深度学习 Java
【Java探索之旅】数组使用 初探JVM内存布局
【Java探索之旅】数组使用 初探JVM内存布局
26 0
|
15天前
|
Java 开发者
【JAVA】Java内存模型中的happen-before
Happen-before关系帮助开发者理解多线程程序中操作的执行顺序和可见性,从而避免竞态条件和数据不一致性问题。它提供了一种可预测的规则来确保线程之间的正确交互。
23 0
|
16天前
|
存储 缓存 安全
深入理解Java内存模型及其作用
深入理解Java内存模型及其作用
|
17天前
|
运维 Kubernetes 算法
Java堆内存又溢出了!教你一招必杀技
Java堆内存又溢出了!教你一招必杀技
|
17天前
|
安全 Java 调度
[Java并发基础] 共享内存
[Java并发基础] 共享内存
|
17天前
|
存储 缓存 Java
[JVM] 浅谈JMM(Java 内存模型)
[JVM] 浅谈JMM(Java 内存模型)