【必会面试题】Java内存模型JMM

2024-06-03 19:28

本文主要是介绍【必会面试题】Java内存模型JMM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 前言
    • 关键组件
    • 性质
    • 内存屏障(Memory Barrier)
      • volatile与synchronized

前言

Java内存模型(Java Memory Model, JMM)是Java平台定义的一种规范,用于描述多线程情况下的变量访问原则线程交互线程内存与主内存的协同工作。JMM的目的是为了屏蔽各种硬件和操作系统内存访问差异,提供一致的内存访问视图,保证数据共享和同步等多线程场景下的数据安全性。

关键组件

  • 主内存:所有线程共享的内存区域,存储了实例字段、静态字段和数组元素等变量。主内存是所有线程创建的对象和变量的最终存储地点。
  • 工作内存(线程私有内存):每个线程都有自己的工作内存,存储了该线程使用到的主内存副本(变量副本)。线程对变量的所有操作(读取、赋值等)都在工作内存中进行,之后可能同步到主内存。

性质

  • 原子性:指操作是不可分割的,要么全部执行要么都不执行。在Java中,除了long和double类型变量外,基本类型的读写操作都是原子性的。更复杂的操作需要通过synchronized或Lock等机制保证。
  • 可见性:一个线程修改了共享变量的值,其他线程能够立即看到这个变化。volatile关键字可以保证这一点,因为它禁止了编译器的重排序,并要求每次访问都从主内存中读取最新的值。
  • 有序性:为了优化性能,编译器和处理器可能会对指令进行重排序。JMM通过happens-before原则(先行发生原则)来保证特定操作间的执行顺序,例如,监视器锁的解锁操作happens-before于后续的加锁操作,从而确保了有序性。

内存屏障(Memory Barrier)

  • 为了确保可见性和有序性,JMM会在适当的位置插入内存屏障。这些屏障会强制处理器暂停重排序,确保某些操作的完成顺序,并更新缓存,使得一个线程对内存的修改对其他线程可见。

volatile与synchronized

  • volatile关键字保证了变量的可见性和部分有序性,但不保证原子性。适合用于状态标记量。
  • synchronized关键字可以提供原子性、可见性和完全的有序性保证,适用于需要互斥访问的代码块或方法。

这篇关于【必会面试题】Java内存模型JMM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027896

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件