Java内存模型,内存屏障是干嘛的?

news2025/2/11 11:41:29

目录

Java 内存模型(Java Memory Model,JMM)

1. 定义和目的

2. 内存结构

3. 三大特性

4. happens-before 原则

内存屏障(Memory Barrier)

1. 定义和作用

2. 分类

3. 在 Java 中的应用

Java 内存模型(Java Memory Model, JMM)

1. 核心概念

2. 内存交互规则

3. 可见性

4. 有序性

5. 原子性

内存屏障(Memory Barrier)

1. 作用

2. 类型

3. 在 Java 中的应用

4. 示例

总结


Java 内存模型(Java Memory Model,JMM)

1. 定义和目的

Java 内存模型(JMM)是 Java 虚拟机规范中定义的一种抽象概念,它屏蔽了各种硬件和操作系统的内存访问差异,保证了 Java 程序在不同的硬件和操作系统平台上都能达到一致的内存访问效果,主要目的是为了确保多线程程序中数据的可见性、原子性和有序性,从而避免出现数据竞争和不一致的问题。

2. 内存结构

JMM 将内存分为主内存和工作内存:

  • 主内存:是所有线程共享的内存区域,存储了所有的共享变量,如实例变量、静态变量等。
  • 工作内存:每个线程都有自己独立的工作内存,线程对共享变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接操作主内存中的变量。线程在工作内存中会拷贝一份主内存中共享变量的副本,操作完成后再将结果刷新回主内存。
3. 三大特性
  • 原子性:指一个操作是不可中断的,要么全部执行成功,要么全部不执行。在 Java 中,对基本数据类型的变量的读取和赋值操作是原子性的,但像 i++ 这种复合操作不是原子性的。可以使用 synchronized 关键字或 Atomic 类来保证操作的原子性。
  • 可见性:当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。由于线程有自己的工作内存,可能会导致一个线程修改了共享变量的值,但其他线程没有及时从主内存中读取到最新的值。可以使用 volatile 关键字、synchronized 关键字或 Lock 来保证可见性。
  • 有序性:程序执行的顺序按照代码的先后顺序执行。但在 Java 中,为了提高性能,编译器和处理器可能会对指令进行重排序。重排序分为编译器重排序、指令级并行重排序和内存系统重排序。JMM 提供了 happens-before 原则来保证部分有序性,同时可以使用 volatile 关键字和 synchronized 关键字来禁止特定类型的重排序。
4. happens-before 原则

happens-before 原则是 JMM 中定义的一些规则,用于判断两个操作之间的执行顺序。如果操作 A happens-before 操作 B,那么操作 A 的结果对操作 B 是可见的,并且操作 A 会在操作 B 之前执行。常见的 happens-before 规则有:

  • 程序顺序规则:一个线程中的每个操作,happens-before 该线程中任意后续操作。
  • 监视器锁规则:对一个锁的解锁,happens-before 随后对这个锁的加锁。
  • volatile 变量规则:对一个 volatile 域的写,happens-before 任意后续对这个 volatile 域的读。
  • 传递性:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。

内存屏障(Memory Barrier)

1. 定义和作用

内存屏障,也称为内存栅栏,是一种 CPU 指令,用于控制特定条件下的重排序和内存可见性问题。在 JMM 中,内存屏障是实现 volatilesynchronized 等关键字语义的基础。其主要作用有两个:

  • 禁止指令重排序:编译器和处理器为了提高性能,可能会对指令进行重排序,但在某些情况下,重排序会影响程序的正确性。内存屏障可以告诉编译器和处理器在内存屏障前后的指令不能进行重排序,保证指令按照特定的顺序执行。
  • 保证内存可见性:内存屏障可以强制刷新处理器的缓存,使得一个线程对共享变量的修改能够及时被其他线程看到。当一个线程执行写操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

LSTM的介绍

网上一些描述LSTM文章看的云里雾里,只是介绍LSTM 的结构,并没有说明原理。我这里用通俗易懂的话来描述一下。 我们先来复习一些RNN的核心公式: h t t a n h ( W h h t − 1 W x x t b h ) h_t tanh(W_h h_{t-1} W_x x_t b_h) ht​tan…

C++ ——从C到C++

1、C的学习方法 (1)C知识点概念内容比较多,需要反复复习 (2)偏理论,有的内容不理解,可以先背下来,后续可能会理解更深 (3)学好编程要多练习,简…

AI技术填坑记2:标注系统

在问答中,通用大模型往往拥有不可控性,而在正常的业务系统里面,往往有自己的各种专门的术语和内容,标注系统可以对大量数据进行标记,确认大模型解答的结果符合设想。 一、总体思路 一个标注,一般分为模块、应用、提问词汇、标注值,其中,模块可以认为是一种应用分类;应…

【机器学习】超参数的选择,以kNN算法为例

分类准确度 一、摘要二、超参数的概念三、调参的方法四、实验搜索超参数五、扩展搜索范围六、考虑距离权重的kNN算法七、距离的计算方法及代码实现八、明可夫斯基距离的应用九、网格搜索超参数 一、摘要 本博文讲解了机器学习中的超参数问题,以K近邻算法为例&#…

哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测

哪吒闹海!SCI算法分解组合四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测 目录 哪吒闹海!SCI算法分解组合四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测效果一览基本介绍程序设计参考资料 效果一览…

Django开发入门 – 3.用Django创建一个Web项目

Django开发入门 – 3.用Django创建一个Web项目 Build A Web Based Project With Django By JacksonML 本文简要介绍如何利用最新版Python 3.13.2来搭建Django环境,以及创建第一个Django Web应用项目,并能够运行Django Web服务器。 创建该Django项目需…

2025.2.8——二、Confusion1 SSTI模板注入|Jinja2模板

题目来源:攻防世界 Confusion1 目录 一、打开靶机,整理信息 二、解题思路 step 1:查看网页源码信息 step 2:模板注入 step 3:构造payload,验证漏洞 step 4:已确认为SSTI漏洞中的Jinjia2…

【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出

目录 一、fprintf() 函数 1.1. 函数简介 1.2. fprintf使用场景 1.3. 注意事项 1.4. 示例 二、fscanf() 函数 2.1. 函数简介 2.2. fscanf使用场景 2.3. 注意事项 2.3. 示例 三、总结 在 C 语言中,格式化文件输入输出函数能够让我们以特定的格式对文件进行…

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

c++----函数重载

目录标题 为什么会有函数重载函数重载的概念函数重载的例子第一个:参数的类型不同第二个:参数的个数不同第三种:类型的顺序不同函数重载的奇异性重载函数的底层原理有关函数重载的一个问题 为什么会有函数重载 大家在学c语言的时候有没有发现…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…

多头自注意力中的多头作用及相关思考

文章目录 1. num_heads2. pytorch源码演算 1. num_heads 将矩阵的最后一维度进行按照num_heads的方式进行切割矩阵,具体表示如下: 2. pytorch源码演算 pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

对接DeepSeek

其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日&#xff0…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…

分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度

一、背景 1.1 产品简介 基于大模型塔斯,整合传统的多项能力(NLP、OCR、CV等),构建以场景为中心的新型智能文档平台。通过文档审阅,实现结构化、半结构化和非结构化文档的信息获取、处理及审核,同时基于大…

8.flask+websocket

http是短连接,无状态的。 websocket是长连接,有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…

【大模型实战】使用Ollama+Chatbox实现本地Deepseek R1模型搭建

下载安装Ollama Ollama官方链接:https://ollama.com/,打开链接后就可以看到大大的下载按钮,如下图: 我选择用Win的安装。将Ollama的安装包下载到本地,如果下载慢可以复制链接到迅雷里面,提高下载速度,如下图: 双击之后,就可以开始安装了,如下图: 默认安装到C盘,…

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图,在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …