写写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 等特殊的处理;接下来还会持续更新!

相关文章
|
15天前
|
存储 SQL 缓存
揭秘Java并发核心:深度剖析Java内存模型(JMM)与Volatile关键字的魔法底层,让你的多线程应用无懈可击
【8月更文挑战第4天】Java内存模型(JMM)是Java并发的核心,定义了多线程环境中变量的访问规则,确保原子性、可见性和有序性。JMM区分了主内存与工作内存,以提高性能但可能引入可见性问题。Volatile关键字确保变量的可见性和有序性,其作用于读写操作中插入内存屏障,避免缓存一致性问题。例如,在DCL单例模式中使用Volatile确保实例化过程的可见性。Volatile依赖内存屏障和缓存一致性协议,但不保证原子性,需与其他同步机制配合使用以构建安全的并发程序。
47 0
|
15天前
|
存储 监控 算法
Java内存管理:从垃圾收集到性能优化
【8月更文挑战第4天】在Java的世界中,内存管理是一块神秘的领域,它不仅关乎程序的稳定运行,更直接影响到系统的性能表现。本文将带你深入理解Java的垃圾收集机制,探讨如何通过合理的内存管理策略来提升应用效率。我们将一起分析JVM内存结构,探索不同的垃圾收集算法,并借助实际代码示例,学习如何监控和调优内存使用,以期达到减少延迟、防止内存泄漏的目的。
|
11天前
|
存储 Java 程序员
Java中对象几种类型的内存分配(JVM对象储存机制)
Java中对象几种类型的内存分配(JVM对象储存机制)
45 5
Java中对象几种类型的内存分配(JVM对象储存机制)
|
5天前
|
存储 Java 开发者
Java 内存模型与垃圾回收机制的深度剖析
在Java的世界里,理解其内存模型和垃圾回收机制是提升编程效率的关键。本文将通过浅显易懂的语言,带你深入了解Java的内存分配原理和垃圾回收过程,让你对Java的性能调优有更深刻的认识。
|
8天前
|
安全 Java 程序员
深入浅出Java内存模型:探索JMM的奥秘
在Java编程世界中,理解其内存模型(JMM)是提升代码性能和确保线程安全的关键。本文将带你走进Java内存模型的大门,通过浅显易懂的方式揭示其工作原理,并指导你如何在实际开发中有效利用JMM来避免常见的并发问题。
|
13天前
|
算法 Java 开发者
Java 内存管理:深入理解垃圾收集机制
在Java的世界中,内存管理是一块基石,它确保了程序的顺畅运行和资源的合理利用。本文将带你深入探讨Java的垃圾收集机制,揭示其工作原理、常见算法以及调优实践。我们将一起探索如何通过理解这一机制来编写更高效的代码,避免内存泄漏,并提升应用性能。
|
10天前
|
Java 开发者
深入浅出Java内存管理
在Java的世界里,内存管理是支撑程序运行的基石。本文将通过浅显易懂的语言和生动的比喻,带你了解Java是如何巧妙地处理内存分配与回收的。我们将一起探索对象在Java内存模型中的生命周期,以及JVM如何通过垃圾收集机制保持内存的健康状态。无论你是初学者还是有一定经验的开发者,这篇文章都将为你揭开Java内存管理的神秘面纱。
|
15天前
|
监控 算法 Java
Java 内存管理:从垃圾收集到性能调优
【8月更文挑战第5天】 本文将深入探讨 Java 的内存管理机制,特别是垃圾收集器(GC)的工作原理及其在性能优化中的关键作用。通过具体案例分析,我们将了解如何选择合适的垃圾收集算法以及调优 JVM 参数来提升应用性能。文章旨在为 Java 开发者提供实用的内存管理和性能调优技巧,帮助他们编写更高效、更稳定的应用程序。
36 3
|
3天前
|
存储 监控 算法
掌握Java内存管理:从入门到精通
在Java的世界里,内存管理是程序运行的心脏。本文将带你走进Java内存管理的奥秘,从基础概念到高级技巧,一步步揭示如何优化你的Java应用。准备好迎接挑战,让我们共同揭开高效内存使用的面纱!
|
6天前
|
存储 缓存 安全
Java内存模型详解
该文章主要介绍了Java内存模型的相关概念和技术细节,包括Java内存模型的定义、缓存一致性策略、内存交互操作、内存屏障等。