广告
返回顶部
首页 > 资讯 > 精选 >Java并发编程中的内存模型是什么
  • 388
分享到

Java并发编程中的内存模型是什么

2023-06-25 17:06:13 388人浏览 薄情痞子
摘要

这篇文章主要介绍“Java并发编程中的内存模型是什么”,在日常操作中,相信很多人在java并发编程中的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的内存模型是什么”的疑惑有所

这篇文章主要介绍“Java并发编程中的内存模型是什么”,在日常操作中,相信很多人在java并发编程中的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的内存模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    1、什么是Java的内存模型

    Java内存模型简称JMM(Java Memory Model),JMM是和多线程并发相关的一组规范。各个JVM实现都要遵循这个JMM规范。才能保证Java代码在不同虚拟机顺利运行。因此,JMM 与处理器、缓存、并发、编译器有关。它解决了CPU 多级缓存、处理器优化、指令重排等导致的结果不可预期的问题。

    Java并发编程中的内存模型是什么

    2、为什么需要Java内存模型

    程序的运行结果依赖于处理器,而不同的处理器规则都不一样,不同处理器差异是很大的,所以同段代码在处理器A运行正常,搬到处理器B运行结果是不一样的,所以为了兼容这种差异,推出了Java内存模型规范,JMM是一个规范标准,JMM保证了不同处理器的处理结果一致,同时也保证不同编译器、jvm等等的一致性。所以就保证了Java语言“书写一次、到处运行”

    3、Java内存模型及操作规范

    共享变量都是放在主内存中的

    每个线程都有自己的工作内存,线程只可操作自己的工作内存

    线程要操作共享变量,需要从主内存中读取到工作内存,改变值之后要从工作内存同步到主内存

    Java并发编程中的内存模型是什么

    4、Java内存模型规定的原子操作

    Java内存模型的同步交换协议,规定了8种原子操作

    原子操作:不可被中断的一个或一系列操作

    • lock定):将主内存中的变量锁定,为一个线程所独占

    • unlock(解锁):将lock加的锁解除,其他的线程有机会访问此变量

    • read(读取):作用于主内存变量,将主内存中的变量值读取到工作内存

    • load(加载):作用于工作内存,将read读取到的值保存到工作内存中的变量副本

    • use(使用):作用于工作内存变量,将值传递给线程的代码执行引擎

    • assign(赋值):作用于工作内存变量,将执行引擎处理返回的值重新赋值给变量副本

    • store(存储):作用于工作内存变量,将变量副本的值传送到主内存中

    • write(写入):作用于主内存变量,将store传送过来的值写入到主内存的共享变量中

    Java内存模型的同步交互协议,执行上述8种原子操作时必须满足如下规则

    不允许read和load,store和write操作之一单独出现。即不允许加载或同步工作到一半。

    不允许一个线程丢弃它最近的assign操作,即变量在工作内存中改变之后,必须将数据同步回主内存

    不允许一个线程无原因地(无assign操作)将数据从工作内存同步到主内存中。

    一个新的变量可能在主内存中诞生。

    一个变量在同一个时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次,多次lock之后必须要执行相同次数unlock操作,变量才会解锁

    如果对一个对象进行lock操作,那么会清空工作内存变量中的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始变量的值

    如果一个对象事先没有被lock,就不允许对其进行unlock操作,也不允许去unlock一个被其他线程锁住的变量。

    对一个变量执行unlock操作之前,必须将此变量同步回主内存中(执行store、write)

    5、Java内存模型同步协议

    Java内存模型的同步协议,操作规范 将一个变量从主内存复制到工作内存要顺序执行read、load操作;要将变量从工作内存同步回主内存要用store、write操作。只要求顺序执行,不一定是连续执行

    图引用网上资料:

    Java并发编程中的内存模型是什么

    6、Java内存模型的HB法则

    并发编程有三个重要特效:原子行可见性有序性

    • 原子性:原子性是指一个或者多个操作,要么全部执行且执行过程不会被其它操作打断,要么全部不执行。

    • 可见性:可见性是指共享变量对于多个线程都是可见的,也即一个线程修改了变量,其它线程马上就能知道

    • 有序性:有序性是指程序的执行顺序按照代码的先后顺便执行

    在说JMM的happens-before(HB)法则之前,先说说并发编程的有序性。说到并发线程的有序性,还需要涉及到指令重排序

    • 什么是指令重排?

    假如我们写一个程序,我们会期待这些语句的实际执行顺便和代码的顺序是一致的,大部分情况是一致的,但实际上,编译器、JVM 或者 CPU 都有可能出于优化等目的,对执行的顺序进行调整,这个就是指令重排序

    • 重排序的好处:提高处理速度

    代码顺序如图:

    Java并发编程中的内存模型是什么

    指令重排后,a=100; a= a+100会提到一起执行,效率提高

    Java并发编程中的内存模型是什么

    上面的例子,是可以提高执行效率,但是有时候指令重排是会导致问题的,如下代码例子,代码顺序是先初始化content,然后设置标识为true,线程B检测到为true之后,调用content的方法

    Java并发编程中的内存模型是什么

    如果指令重排后,这种情况就会出现没初始化完成,就直接调用conten的方法

    Java并发编程中的内存模型是什么

    所以,指令重排有好处也有坏处,一般可能是cpu、编译器或者是内存会进行指令重排,为了避免指令重排,保证并发编程的有序性,有时候需要使用synchronized等锁或者volatile等等方式避免

    JMM规定了happens-before(先行发生)原则,来保证很多操作的有序性。

    当我们代码操作不满足先行发生原则时,则需在编码时使用volatile、synchronized来保证有序性

    JMM的HB法则

    • 程序顺序规则:每个线程的每个操作都happens-before该线程中任意的后续操作

    • 监视器锁规则:一个锁的解除,happens-before于随后对这个锁的加锁

    • volatile变量规则:对volatile域的写,happens-before于任意后续对这个volatile域的读

    • 线程启动规则:在某个线程对象上调用start()方法happens-before被启动线程中的任意动作

    • 线程终止规则:线程中所有操作都先行发生于对此线程的终止检测,如在线程t1中成功执行了t2.join(),则t2中的所有操作对t2可见

    • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生

    • 对象终结规则:一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize方法的开始传

    • 递性:如果A happens-before于B,且B happens-before 于C,那么A happens-before于C

    到此,关于“Java并发编程中的内存模型是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Java并发编程中的内存模型是什么

    本文链接: https://www.lsjlt.com/news/306197.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java并发编程中的内存模型是什么
      这篇文章主要介绍“Java并发编程中的内存模型是什么”,在日常操作中,相信很多人在Java并发编程中的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的内存模型是什么”的疑惑有所...
      99+
      2023-06-25
    • 并发编程之Java内存模型
      目录一、Java内存模型的基础1.1 并发编程模型的两个关键问题1.2 Java内存模型的抽象结构1.3 从源代码到指令重排序1.4 写缓冲区和内存屏障1.4.1 写缓冲区1.4.2...
      99+
      2022-11-12
    • Java并发编程之Java内存模型
      目录1、什么是Java的内存模型2、为什么需要Java内存模型3、Java内存模型及操作规范4、Java内存模型规定的原子操作5、Java内存模型同步协议6、Java内存模型的HB法...
      99+
      2022-11-12
    • 怎么浅谈Java并发编程中的Java内存模型
      这篇文章的内容主要围绕怎么浅谈Java并发编程中的Java内存模型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!物理计算机并发问题在介绍Java内存...
      99+
      2023-06-17
    • 并发编程之Java内存模型锁的内存语义
      目录1、锁的释放-获取建立的happens-before关系2、锁释放和获取的内存语义3、锁内存的语义实现4、concurrent包的实现简介: 锁的作用是让临界区互斥执行。本文阐述...
      99+
      2022-11-12
    • 并发编程之Java内存模型volatile的内存语义
      1、volatile的特性 理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是使用同一个锁对单个读/写操作做了同步。 代码示例: package ...
      99+
      2022-11-12
    • Java并发中的内存模型
      这篇文章主要讲解了“Java并发中的内存模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发中的内存模型”吧!CPU和内存在讲JMM之前,我想先和大家聊聊硬件层面的东西。大家应该都...
      99+
      2023-06-02
    • java高并发的volatile与Java内存模型是什么
      这篇文章将为大家详细讲解有关java高并发的volatile与Java内存模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。public class Demo09 {&...
      99+
      2023-06-25
    • Java并发编程之volatile与JMM多线程内存模型
      目录一、通过程序看现象二、为什么会产生这种现象(JMM模型)?三、MESI 缓存一致性协议 一、通过程序看现象 在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码...
      99+
      2022-11-13
    • 并发编程之Java内存模型顺序一致性
      目录1、数据竞争和顺序一致性1.1 Java内存模型规范对数据竞争的定义1.2 JMM对多线程程序的内存一致性做的保证2、顺序一致性内存模型2.1 特性2.2 举例说明顺序一致性模型...
      99+
      2022-11-12
    • Java的内存模型是什么
      这篇文章主要介绍“Java的内存模型是什么”,在日常操作中,相信很多人在Java的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的内存模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-06-15
    • Java内存模型的并发处理示例
      这篇文章给大家分享的是有关Java内存模型的并发处理示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. ...
      99+
      2023-06-14
    • java中内存模型的作用是什么
      java中内存模型的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、...
      99+
      2023-06-14
    • java高并发的volatile与Java内存模型详解
      public class Demo09 { public static boolean flag = true; public static class T1...
      99+
      2022-11-12
    • Java内存模型volatile的内存语义是什么
      这篇文章主要介绍“Java内存模型volatile的内存语义是什么”,在日常操作中,相信很多人在Java内存模型volatile的内存语义是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java内存模型v...
      99+
      2023-06-25
    • Java并发编程之volatile与JMM多线程内存模型实例分析
      本篇内容主要讲解“Java并发编程之volatile与JMM多线程内存模型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之volatile与JMM多线程内存模型实例分析”...
      99+
      2023-06-30
    • Golang函数的内存模型和并发编程的关系和模式
      Golang函数的内存模型和并发编程的关系和模式Golang(Go)是一种新兴的编程语言,它以简单、高效和并发编程为特色。在Golang中,函数是一等公民,因此理解其内存模型对于正确使用和优化性能至关重要。随着计算机硬件的发展,多核和分布式...
      99+
      2023-05-16
      Golang 并发编程 内存模型
    • Java内存模型的原理是什么
      这篇文章将为大家详细讲解有关Java内存模型的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。所有的编程语言中都有内存模型这个概念,区别于微架构的内存模型,高级语言的内存模型包括了编...
      99+
      2023-06-17
    • Java内存模型的规定是什么
      本篇内容介绍了“Java内存模型的规定是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先要明确内存模型指什么。书中的定义是:在特定的操...
      99+
      2023-06-02
    • Java内存模型的概念是什么
      这篇文章主要介绍了Java内存模型的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java内存模型的概念是什么文章都会有所收获,下面我们一起来看看吧。内存模型,英文名Memory Model,他是一个...
      99+
      2023-06-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作