首页 > 系统相关 >你对内存模型(JMM)理解多少?

你对内存模型(JMM)理解多少?

时间:2024-06-12 16:30:22浏览次数:10  
标签:happens 模型 线程 内存 JMM volatile before

Java 内存模型(JMM)是一个抽象概念,它规定了在Java并发编程中如何处理多线程之间的内存交互。JMM 解决并发程序中最关键的两个问题:线程间的可见性指令重排序

线程间的可见性:确保当一个线程修改了共享变量的值时,其他线程可以立即看到这一改变。没有良好的可见性保证,一个线程对共享变量的修改可能对其他线程不可见,导致数据不一致。

指令重排序:为了提高性能,编译器处理器常常会改变指令的执行顺序(只要这种改变不影响单线程内的程序逻辑)。然而,在多线程环境下,这种重排序可能导致严重问题。

JMM 通过以下几种方式来控制和协调上述现象:

  1. 原子性(Atomicity): JMM 保证了基本读取和写入操作的原子性。例如,对于声明为 volatile 的变量,其读和写操作都是原子的。

  2. 可见性(Visibility): 为了确保一个线程对共享变量所做的修改可以被其他线程看到,JMM 引入了 volatile 关键字和锁(synchronization)。当一个变量被声明为 volatile 后,对这个变量的修改立即会刷新到主内存,其他线程读这个变量也会直接从主内存读取。

  3. 有序性(Ordering): 即便是在无依赖的操作中,JMM 也禁止编译器和处理器进行重排序。通过 synchronized 和 volatile 关键字,以及 final 字段,JMM 可以在特定条件下避免指令重排序。

happens-before 原则:

Happens-Before规则是Java内存模型(JMM)中的一个重要概念,用于描述多线程环境下操作之间的顺序和可见性。如果操作A happens-before操作B,那么JMM保证A的结果对B可见,并且A的操作顺序在B之前。这个规则提供了一种跨线程内存操作的可预测性,帮助程序员编写正确的并发代码。一些关键的happens-before规则包括:

  1. 程序顺序规则:在一个线程内,每个操作都happens-before于该线程中的任意后续操作。

  2. 监视器锁规则:对一个锁的解锁happens-before于随后对这个锁的加锁。

  3. volatile变量规则:对一个volatile字段的写入happens-before于任何后续对这个volatile字段的读取。

  4. 线程启动规则:Thread对象的start()方法happens-before于此线程的每一个动作。

  5. 线程终结规则:线程中的所有操作都happens-before于对此线程的终结检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段进行检测。

  6. 中断规则:对线程interrupt()的调用happens-before于被中断线程检测到中断事件的发生。

  7. 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。

总结:由于 Java 并发编程复杂性很高,JMM 提供了一套规则让开发者在多线程环境下编写出能够正确交互的代码。尽管 JMM 不直接涉及垃圾收集和其他内存管理方面,了解 JMM 对于理解内存操作的并发问题非常关键。

标签:happens,模型,线程,内存,JMM,volatile,before
From: https://blog.csdn.net/weixin_53391173/article/details/139499384

相关文章

  • 简介&何为领域驱动设计&模型驱动设计
     简介软件是一种被创建用来帮助我们处理现代生活中复杂问题的工具,它只是到达目的的一种方法,而这个目的通常就是非常实际和真实的事情。软件必须是实际和有用的,否则我们不会花那么多时间和资源去创建它。这就使它和我们生活的某个方面有非常密切的联系。软件设计是一门艺术,像......
  • 大模型在医疗行业中的应用
    模型在医疗方面的应用正逐渐深入,为医疗领域带来了革命性的变革。以下是关于大模型在医疗方面应用的详细概述:一、疾病诊断和预测应用背景:通过分析大量的医疗数据,如病人的病例、病理图像和基因组数据,大模型能够帮助医生更准确地诊断和预测疾病。技术原理:利用深度学习技......
  • 发布会后苹果股价创历史新高;商汤 Embedding 模型拿下 SOTA丨 RTE 开发者日报 Vol.223
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 大模型「训练」与「微调」概念详解【6000字长文】
    本文你将学到什么1、大模型预训练与微调的基本流程2、预训练、训练、后期预训练、微调的区别3、大模型训练与微调的一些概念,如:Post-pretrain、SFT、RLHF、模型对齐、Lora、Q-Lora、大模型量化、微调指标、微调参数、大模型评测指标预训练与微调概览在大模型的预训练与微......
  • 大模型三种架构
    大模型进化树灰色代表其他模型粉色表示encoder-only绿色代表encoder-decoder蓝色代表decoder-only1.encoder-only代表的有google的bert模型。专注于理解和编码输入信息,常用于分类、标注等任务优点:强大的理解能力:能够有效处理和理解输入数据。缺点:生成能力有限:不擅......
  • yolov5内存分布分析 转载
    yolov5内存分布分析Transpose输出分析假设batch_size为1,yolov5有三个输出,shape分别是:(1,3,80,80,85)(1,3,40,40,85)(1,3,20,20,85)其中3代表anchor数量,20*20代表feature_map大小,85代表boundbox的(x,y,w,h,c+80个类别的概率)其中(x,y,w,h,c+80个类别的概率)在内存中是连续分......
  • AI大模型战场:通用大模型与垂直大模型的角逐
    随着人工智能技术的迅猛发展,AI大模型已成为推动科技进步的重要力量。然而,在AI大模型的战场上,通用大模型与垂直大模型之间的分化日益明显。两者各有其独特的优势和潜力,在不同的应用场景中发挥着重要作用。那么,在这场通用与垂直的角逐中,谁将占据优势地位?一、通用大模型的广泛适......
  • AI大模型探索之路-实战篇:智能化IT领域搜索引擎的构建与初步实践
    系列篇章......
  • LLM应用实战:当图谱问答(KBQA)集成大模型(三)
    1. 背景最近比较忙(也有点茫),本qiang~想切入多模态大模型领域,所以一直在潜心研读中...本次的更新内容主要是响应图谱问答集成LLM项目中反馈问题的优化总结,对KBQA集成LLM不熟悉的客官可以翻翻之前的文章《LLM应用实战:当KBQA集成LLM》、《LLM应用实战:当KBQA集成LLM(二)》。针对K......
  • FreeRTOS学习笔记-基于stm32(14)内存管理
    一、FreeRTOS内存管理简介        FreeRTOS有两种方法来创建任务,队列,信号量等,一种动态一种静态。静态方法需要手动定义任务堆栈。使用动态内存管理的时候FreeRTOS内核在创建任务、队列、信号量的时候会动态的申请RAM。    我们在移植FreeRTOS时可以看到......