Java内存模型-Java内存模型的基础1

简介: 章节目录1.并发编程需要解决的问题-线程间通信&线程间同步2.Java内存模型的抽象结构3.从源代码到指令序列的重排序4.happens-before 简介1.

章节目录

  • 1.并发编程需要解决的问题-线程间通信&线程间同步
  • 2.Java内存模型的抽象结构
  • 3.从源代码到指令序列的重排序
  • 4.happens-before 简介

1.并发编程需要解决的问题-线程间通信&线程间同步

并发编程中需要处理两个关键问题:线程间通信、 线程间同步

线程之间通信机制分为两种:共享内存消息传递
共享内存通信与同步

操作类型 实现方式
通信 线程之间共享程序的公共状态,通过写-读内存中的变量的公共状态进行隐式通信
同步 显式进行同步,必须显式制定某个方法或某段代码需要在线程之间互斥执行

消息传递通信与同步

操作类型 实现方式
通信 线程之间没有公共状态,线程之间通过发送消息显式进行通信
同步 隐式进行同步,消息发送必须在消息发送之前

注意:java并发采用的是共享内存模型,java线程之间的通信总是隐式进行的。

2.Java内存模型的抽象结构

  • 在Java中所有的实例对象、静态数据域、和数组元素都存储在堆内存当中,堆内存在线程之间是共享的。 -堆中数据域是线程共享的
  • 局部变量、方法定义参数、和异常处理器参数不会在线程之间共享、他们不会有内存可见性问题,也不受内存模型的影响。-线程独享的

JMM简介
JMM决定一个线程对共享变量的写入何时对另一个线程可见。(可见性保证)
如下图所示:

img_d5ea21deb7dc4d01933818c3bc91fc28.png
JMM内存模型抽象结构示意图

图示解释

1.线程之间共享的变量存储在主内存中,每个线程都有一个本地内存,本地内
存中存储了用共享内存中共享数据的副本。

线程A与线程B之间进行通信

1.线程A把本地内存A中更新过的共享变量刷新到主存中去
2.线程B到主存中去读取线程A之前已更新过的新的共享变量

JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。

3.从源代码到指令序列的重排序

重排序的作用

在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。
重排序类型 含义
编译器优化的重排序 编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序
指令级并行的重排序 不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序
内存系统的重排序 处理器采用缓存和读/写缓冲区,这使得加载和存储操作看起来是在乱序执行
对于处理器重排序,JMM处理器重排序规则要求java编译器在生成指令序列
时,插入特定类型的内存屏障指令,通过内存屏障指令禁止特定类型的处理器
重排序。

4.happens-before 简介

Java内存模型,使用happens-before的概念来阐述操作之间的内存可见性、
在JMM中,如果一个操作执行的结果需要对另一个操作可见、那么两个操作之间必须要存在happens-before(前一个操作的结果对后一个操作可见)关系。

与程序员密切相关的happens-before规则如下:

1.程序顺序规则:一个线程中的每个操作,happens-before于线程中的任意后续操作。
2.监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
3.volatile规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
4.传递性:如果A操作happens-beforeB,且B happens-before C,那么A happens-before C。
目录
相关文章
|
25天前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
26 0
|
27天前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
37 8
|
25天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
27天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
27天前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
24天前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
38 0
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
135 4
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
501 37
|
2月前
|
存储 安全 Java
java基础面试题
java基础面试题
34 2
|
4月前
|
Java
【Java基础面试四十一】、说一说你对static关键字的理解
这篇文章主要介绍了Java中static关键字的概念和使用规则,强调了类成员与实例成员的区别及其作用域的限制。

热门文章

最新文章