返回顶部
首页 > 资讯 > 后端开发 > Python >Java并发内存模型详情
  • 886
分享到

Java并发内存模型详情

2024-04-02 19:04:59 886人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、Java内存模型2、硬件内存架构3、实际执行3.1 共享对象可见性3.2 竞争条件Java是一门支持多线程执行的语言,要编写正确的并发程序,了解Java内存模型是重要前提。而

Java是一门支持多线程执行的语言,要编写正确的并发程序,了解Java内存模型是重要前提。而了解硬件内存模型有助于理解程序的执行。

本文主要整理以下内容

  • Java内存模型
  • 硬件内存架构
  • 共享对象可见性
  • 竞争条件

1、Java内存模型

Java内存模型最新修订是在Java5jsR-176 罗列了 J2SE5.0 相关发布特性,包含其中的 JSR-133(JavaTM内存模型与线程规范),java虚拟机遵循此规范。延续至今该内存模型在Java8中依然奏效。

JSR 全称 Java Specification Requests,意为Java标准化技术规范的正式请求。

Java程序运行在虚拟机上(JVM)。从逻辑角度看,Jvm内存被划分为线程堆栈和堆。每个线程都拥有自己的堆栈,该线程堆栈存储的数据不对其它线程可见。堆内存用于存储共享数据。

线程堆栈存储方法中所有局部变量,包含原始类型(booleanbyteshortcharintlongfloatdouble)和对象引用。

堆存储需要共享对象和静态变量。

注意:对象不一定都会存储到堆内存。看下面例子,假如果Object对象不需要被其它线程共享,编译器会执行堆分配转化为栈分配。

解释一下,编译器会根据对象是否逃逸做出优化。优化的其中一项就是堆分配转化为栈分配,目的在于减轻GC压力,提升性能。此优化动作由Jvm参数-XX:+DoEscapeAnalysi 进行控制。Java8 默认开启。

测试:通过开启或关闭 -XX:+PrintGC -XX:-DoEscapeAnalysis 观察是否执行GC来判断对象存储位置。


public static void main(String[] args){
     for(int i = 0; i < 10000000; i++){
         createObj();
     }
 }
 public static void createObj(){
     new Object();
 }


2、硬件内存架构

如下图,现代计算机通常都装有2个或者更多的CPUCPU又可以是多核。一个CPU包含一组寄存器,每个CPU具有一个高速缓存,而高速缓存又分为L1,L2,L3,L4 不同层级缓存。

RAM为主存储也就是我们说的计算机内存,所有CPU都可以读取主存储。

CPU读取主存储数据时,它会将部分主存储数据读入CPU高速缓存中,又将缓存的中一部分读入寄存器执行,操作结束后,将值从寄存器刷新到高速缓存中,高速缓存在特定的时刻将数据统一刷新到内存中。

3、实际执行

事实上,上面阐述的Java堆栈内存模型是为了理解抽象出来的。实际执行就像下图一样,线程栈和堆的数据可能分散到硬件不同的存储区域。数据分散在不同区域会带来以下两个主要问题。

3.1 共享对象可见性

下面场景两个线程同时操作对象obj.count,其中一个线程对obj.count进行更新,但是对其它线程不可见。

线程A操作obj时,先从主存里拷贝一个数据副本到CPU高速缓存,又到寄存器,然后修改obj.count=2后刷新到CPU高速缓存,但是数据暂未同步到主存。以此同时线程B也操作obj,拷贝的数据副本仍然为obj.count=1,这会导致程序结果错误。

解决此问题,可以使用Java volatile关键字。volatile可简单理解为跳过CPU高速缓存,让修改结果及时同步到主存,从而保证了其它线程读到最新值。volatile 后期专门介绍。

3.2 竞争条件

另外一种情况假如果多个线程同时更行obj.count,这时会发生竞争条件。

解决方法,使用Java synchronized 保证线程执行顺序,另外synchronized包裹中的所有变量都直接从主存读取(跳过CPU高速缓存),并且当线程退出synchronized后,所有更新的变量将同步到主存。

总结:

本文记录Java内存模型,其中主要内容来源于 Jakob Jenkov 大神博客。

   Http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

到此这篇关于java并发内存模型详情的文章就介绍到这了,更多相关Java并发内存模型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java并发内存模型详情

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

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

猜你喜欢
  • Java并发内存模型详情
    目录1、Java内存模型2、硬件内存架构3、实际执行3.1 共享对象可见性3.2 竞争条件Java是一门支持多线程执行的语言,要编写正确的并发程序,了解Java内存模型是重要前提。而...
    99+
    2024-04-02
  • Java并发中的内存模型
    这篇文章主要讲解了“Java并发中的内存模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发中的内存模型”吧!CPU和内存在讲JMM之前,我想先和大家聊聊硬件层面的东西。大家应该都...
    99+
    2023-06-02
  • java高并发的volatile与Java内存模型详解
    public class Demo09 { public static boolean flag = true; public static class T1...
    99+
    2024-04-02
  • Java并发编程之Java内存模型
    目录1、什么是Java的内存模型2、为什么需要Java内存模型3、Java内存模型及操作规范4、Java内存模型规定的原子操作5、Java内存模型同步协议6、Java内存模型的HB法...
    99+
    2024-04-02
  • 并发编程之Java内存模型
    目录一、Java内存模型的基础1.1 并发编程模型的两个关键问题1.2 Java内存模型的抽象结构1.3 从源代码到指令重排序1.4 写缓冲区和内存屏障1.4.1 写缓冲区1.4.2...
    99+
    2024-04-02
  • Java内存模型的并发处理示例
    这篇文章给大家分享的是有关Java内存模型的并发处理示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. ...
    99+
    2023-06-14
  • 并发编程之Java内存模型volatile的内存语义
    1、volatile的特性 理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是使用同一个锁对单个读/写操作做了同步。 代码示例: package ...
    99+
    2024-04-02
  • 并发编程之Java内存模型锁的内存语义
    目录1、锁的释放-获取建立的happens-before关系2、锁释放和获取的内存语义3、锁内存的语义实现4、concurrent包的实现简介: 锁的作用是让临界区互斥执行。本文阐述...
    99+
    2024-04-02
  • Java——内存模型详解!
    Java内存模型是一种抽象的规则或规范,定义了程序中存在竞争现象的对象(包括实例字段、静态字段和数组对象,不包括局部变量,形式参数;后者是线程私有,不存在竞争问题)的访问方式。         如果我们要想深入了解Java并发编程,就要先理...
    99+
    2023-10-20
    java 开发语言
  • Java内存模型详解
    目录什么是JMM主存与工作内存volatile 关键字有什么用一个线程对共享变量做了修改之后,其他的线程能够看到(感知到)该变量的这种修改(变化)什么是JMM JMM全称Java M...
    99+
    2023-05-18
    Java内存模型 Java JMM模型
  • java高并发的volatile与Java内存模型是什么
    这篇文章将为大家详细讲解有关java高并发的volatile与Java内存模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。public class Demo09 {&...
    99+
    2023-06-25
  • 详解Java的内存模型
    目录JVM的内存模型Java “一次运行,到处编译” 的真面目JVM的本质和位置JVM的内存模型总览线程私有区域线程共享区域直接内存从例子来理解内存模型JVM的内存模型 Java “...
    99+
    2024-04-02
  • Java内存模型JMM详解
    Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、线程栈等内存...
    99+
    2023-05-30
    java 内存模型 详解
  • JAVA内存模型(JMM)详解
    目录前言JAVA并发三大特性可见性有序性原子性Java内存模型真面目Happens-Before规则1.程序的顺序性规则2. volatile 变量规则3.传递性锁的规则5.线程 s...
    99+
    2022-12-08
    JAVA 内存模型 java内存模型和jvm内存模型的区别 java jmm模型
  • Java并发编程中的内存模型是什么
    这篇文章主要介绍“Java并发编程中的内存模型是什么”,在日常操作中,相信很多人在Java并发编程中的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的内存模型是什么”的疑惑有所...
    99+
    2023-06-25
  • Java内存区域与内存模型详解
    这篇文章主要介绍“Java内存区域与内存模型详解”,在日常操作中,相信很多人在Java内存区域与内存模型详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java内存区域与内存模型详解”的疑惑有所帮助!接下来...
    99+
    2023-06-02
  • 怎么浅谈Java并发编程中的Java内存模型
    这篇文章的内容主要围绕怎么浅谈Java并发编程中的Java内存模型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!物理计算机并发问题在介绍Java内存...
    99+
    2023-06-17
  • Java内存模型图文详解
    1. 概述多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,...
    99+
    2014-08-03
    Java
  • 详细分析Java内存模型
    目录一、为什么要学习并发编程二、为什么需要并发编程三、从物理机中得到启发四、Java 内存模型五、原子性5.1、什么是原子性5.2、如何保证原子性六、可见性6.1、什么是可见性6.2...
    99+
    2024-04-02
  • 并发编程之Java内存模型顺序一致性
    目录1、数据竞争和顺序一致性1.1 Java内存模型规范对数据竞争的定义1.2 JMM对多线程程序的内存一致性做的保证2、顺序一致性内存模型2.1 特性2.2 举例说明顺序一致性模型...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作