Java内存模型和硬件内存模型的联系是什么?

Java内存模型 Java 内存模型规定了 Java 虚拟机如何与计算机内存 (RAM) 协同工作。Java 虚拟机是整个计算机的模型,因此该模型自然包含一个内存模型,也就是 Java 内存模型。如果你想设计出性能良好的并发程序,理解 Java 内存模型至关重要。Java 内存模型规定了不同线程如何以及何时可以访问其他线程写入共享变量的值,以及如何在必要时同步对共享变量的访问。原始的 Java 内存模型存在不足,因此 Java 1.5 中对 Java 内存模型进行了修订。 阅读详情

        Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操作系统,作为一个操作系统就有内存模型,这就是我们常说的JAVA内存模型。

        如果我们想正确的写多线程的并行程序。理解好java内存模型在多线程下的工作方式是及其重要的,这可以帮我们更好的理解底层的工作方式。

        java内存模型说明了不同的线程怎样以及何时可以看到其他线程写入共享变量的值,以及同步程序怎么共享变量。最初的java内存模型不够好,存在很多的不足,所以在java1.5z中,java内存模型的版本的进行了一次重大的更新与改进,并且在java8中仍然被使用。

内部java内存模型

        JVM的内部的内存模型分为了两部分,thread stack和heap,也就是线程栈和堆,我们将复杂的内存模型抽象成下图:

        每一个在JVM中运行的线程在内存里都会有属于自己的线程栈。线程栈一般包含这个线程的方法执行到哪一个点了这些信息,也被称作“call stack”,当线程执行代码,调用栈就会随着执行的状态改变。

        线程栈也包括了每个方法执行时的local 变量,所有的方法也都存储在线程栈上,一个线程可以只能访问自己的线程栈。每个线程自己创建的本地本地变量对其他线程是不可见的,也就是私有的,即使两个线程调用的是同一个方法,每个线程会分别保存一份本地变量,各自属于各自的线程栈。

        所有基本类型的local变量( boolean, byte, short, char, int, long, float, double)全都被存储在线程栈里,而且对其他线程是不可见的,一个线程可能会传递一份基本类型的变量值的一份拷贝给另一个线程,但是自己本身的变量是不能共享的,只能传递拷贝。

        堆中存储着java程序中new出来的对象,不管是哪个线程new出来的对象,都存在一起,而且不区分是哪个线程的对象。这些对象里面也包括那些原始类型的对象版本(e.g. Byte, Integer, Long etc.). 不管这个对象是分配给本地变量还是成员变量,最终都是存在堆里。

        下面这个图就说明了线程栈中存储了local变量,堆中存储着对象object。

​        一个原始数据类型的本地变量将完全被存储在线程栈中。

        本地变量也可以是指向对象的引用,在这种情况下,本地变量存在线程栈上,但是对象本身是存在堆上。

        一个对象可能包含方法这些方法同时也会包含本地变量,这些本地变量也是存储在线程栈上面,即使他们所属于的对象和方法是存在堆上的。

        一个对象的成员变量是跟随着对象本身存储在堆上的,不管成员变量是原始数据类型还是指向对象的引用。

        静态的类变量一般也存储在堆上,根据类的定义。

        存储在堆上的对象可以被所有的线程通过引用来访问。当一个线程持有一个对象的引用时,他同时也就可以访问这个对象的成员变量了。如果两个线程同时调用同一个对象的一个方法,他们就会都拥有这个对象的成员变量,但是每一个线程会享有自己私有的本地变量。

        下面这张图就说明以上的内容

​        两个线程有一系列的本地变量。其中一个本地变量(Local Variable 2)指向堆中的object3.这两个线程每个都有指向同一个对象object3的不同引用。他们的引用是本地变量,都存在各自的线程栈中,虽然这两个不同的引用是指向同一个对象的。

        我们还可以发现,共有的对象object3有指向object2和object4的引用,这些引用是作为object3中的成员变量存在的。通过object3中的成员变量的引用,两个线程都可以访问到object2和object4.

        这个图也说明了指向堆中不同对象的本地变量。例如图中的object1和object5,不是同一个对象。理论上,所有的线程都可以访问堆中的对象,只要这个线程持有堆中对象的引用。但是这个图中,每个线程只有这两个对象中的一个引用。

        下面,我们将写一段实际的代码,这段代码的内存模型就跟上图一样:

public class MyRunnable implements Runnable() {

    public void run() {
        methodOne();
    }

    public void methodOne() {
        int localVariable1 = 45;

        MySharedObject localVariable2 =
            MySharedObject.sharedInstance;

        //... do more with local variables.

        methodTwo();
    }

    public void methodTwo() {
        Integer localVariable1 = new Integer(99);

        //... do more with local variable.
    }
}
public class MySharedObject {

    //static variable pointing to instance of MySharedObject

    public static final MySharedObject sharedInstance =
        new MySharedObject();


    //member variables pointing to two objects on the heap

    public Integer object2 = new Integer(22);
    public Integer object4 = new Integer(44);

    public long member1 = 12345;
    public long member1 = 67890;
}

        如果两个线程执行run方法那么,上图的内存模型就会是这段程序的执行结果。

        methodOne()声明了一个原始数据类型的本地变量,int类型的localVariable1 ,和一个指向对象的引用的本地变量(localVariable2).

        每个线程执行methodOne()的时候都会创建属于自己的一份本地变量的拷贝,也就是 localVariable1 and localVariable2在他们各自的线程栈的空间中。localVariable1将会被完全对其他线程是不可见的,只存在与每个线程自己的线程栈空间中。一个线程不能看到其他线程对localVariable1所做的改变与操作,是不可见的。

        每个线程执行methodOne()方法的时候也会创建localVariable2的拷贝,但是不同的localVariable2的拷贝最终却指向同一个堆上的对象。这段代码让localVariable2指向之前通过一个静态变量引用的对象。静态变量只会存在一份,不会有多余的拷贝,而且静态变量是存在堆中的。所以,localVariable2的两份拷贝同时指向同一个MySharedObject对象的实例,与此同时,还有一个堆中的静态变量也指向这个对象实例。这个对象就是对应上图中的object3.

        我们发现MySharedObject 包含这两个成员变量。这些成员变量跟对象一样存储在堆上。这两个成员变量指向两个integer对象。这两个对象分别对应上图中的object2和object4.

        我们发现,methodTwo() 创建了一个本地变量叫做localVariable1。这个本地变量是一个对象的引用,他指向一个integer对象。这个方法将本地变量localVariable1指向一个新的值。在执行methodTwo()的时候,每个线程都会持有一份localVariable1的拷贝。这两个Integer对象将会被初始化在堆上,但是因为每次执行这个方法的时候,这个方法都会创建一个新的对象,所以两个线程会拥有独立的对象实例。这两个对象就对应上图中的object1和object5.

        我们发现MySharedObject 中的成员变量是原始数据类型,但由于他们是成员变量,所以依旧存储在堆上。只有本地变量存储在线程栈中。

硬件层面的内存模型

        硬件层面的内存内存结构与JVM中的内存结构是有不同的,对我们来说,正确理解掌握硬件层面的内存模型是很必要的,这可以帮助我们理解java多线程的底层机制,更要了解java内存模型如何在硬件内存结构上工作。这一章将讲述硬件层面内存模型,下一部分将讲述java如何结合硬件工作。

        下图是一个简化的现代计算机硬件结构图:

​        现代计算机通常会有两个甚至更多的cpu,这些cpu可能还会有多个核心,这个意义是,拥有多个cpu的计算机可能会有多个线程在同时执行,每个cpu都可以在任何给定的时间运行一个线程。这就意味着如果我们的java程序是多线程的,在内部就每个线程就会有一个cpu在同时执行。

        每个cpu都会有一系列的寄存器registers在cpu的内存中,而且这些寄存器是很重要的。cpu在寄存器上进行计算操作比在主内存中进行计算要快的多。这是因为cpu访问寄存器的速度比访问内存要快得多。

        每个cpu也会有一个cpu的cache内存。这是因为cpu访问cache比访问内存的速度要快得多,但是却比访问的寄存器要慢一些,所以cache的速度是介于寄存器和内存的。一些cpu还有多级cache,比如(Level 1 and Level 2),但是这对于我们理解java内存模型关系不大,我们只需要cpu有三层内存结构,寄存器-cache-内存(RAM).

        一台计算机一般都会有主内存也就是RAM,所有cpu都可以访问主内存,主内存的容量一般远比cache大得多。

        一般的,当cpu需要访问内存的时候,他会先读取一部分主内存到cache中,甚至,会读取一部分cache到内部的寄存器中,然后再在寄存器进行计算操作。当cpu将计算结果写回内存中时,他会flush寄存器和cache中的数据,然后将值写回至内存中。

        当cpu要求cache去存储其他内容时,也会将cache中的内容flush到内存中。cpu的cache可以边写入一部分数据到内存,边写入一部分到自己cache中,所以在更新数据,不必要全部清空cache,可以边读边写。一般的,cache真正更新数据是在更小的内存块上,叫做“cache lines”。多个“cache lines”可能正在读取数据到cache中,而另一部分可能正在将数据写回到内存中。

Java内存模型和硬件内存模型的联系

        上文已经提到,java内存模型和硬件内存模型是不同的。硬件内存模型不区分堆和栈。在硬件层面,所有的线程栈和堆都被存储在主内存中,一部分线程栈和堆可能有时候会出现在cpu cache中和cpu寄存器中。下图可以说明这个问题:

​        当对象和变量被存储在不同的内存区域的时候,很多问题就可能发生,主要有以下两类问题:

  • 当线程对一些共享数据进行更新或者写操作时,可见性的问题

  • 当读写共享数据产生资源竞速的问题 接下来的部分就会讨论这两个问题

共享对象的可见性

        如果多个线程在共享一个对象,没有正确使用volatile或者synchronize声明,更新共享对象的时候就可能出现其他线程不可见的问题。

        我们假设共享对象初始化主内存中。一个在cpu中运行的线程读取共享对象到cache中。这时候,随着程序的执行,可能导致共享对象发生一些变化。只要cpu的cache还没有被写回到主内存中,这个共享对象的变化就对其他在cpu上运行的线程不可见。这种情况下,每个线程都会有持有一份自己对于共享对象的拷贝,这份拷贝存储在各自的cpu的cache中,而且对于其他线程是不可见的。

        下图说明了大致的情况,在左边cpu执行的线程将共享对象读取到cache中,并且将他的值改变为2.这个变化对右边的cpu的其他线程是不可见的,因为对于变量count的更新还没有被写回到主内存中。

​        想要解决这个共享对象可见性的问题,可以使用java的volatile关键字(参见笔者的另一篇volatile的博文),这个关键字可以保证所给定的变量都是直接从主内存中读取,而且每当更新时就立即写回到内存中,所以可以保证变化是及时可见的。

资源竞速

        如果多个线程共享一个对象,而且多个线程需要更新共享对象中的变量,那么就可能造成资源竞速的发生。

        假设线程A读取读取一个共享对象的变量count到cpu的cache中,同时,线程B也执行同样的步骤,但是是读取到一个不同的CPU的cache中,现在线程A给count加一,线程B也做同样的事情,现在这个变量被加了两次,分别在不同的cpu的cache中。

        如果这两次递增操作是被按顺序先后执行的,这个变量count就会被加两次而且比最初的值加了2,写回到主内存中。

        然而,如果这两个递增操作是并发执行的,且没有正确的进行同步操作,写回内存的时候,更新后的值只会被加一,虽然实际上是进行了两次递增操作。 下图就说明了程序并发执行的时候,产生的资源竞速的问题:

​

        想要解决这个问题,我们可以使用java中的synchronize关键字。synchronize可以保证只有一个线程能进入那些被声明为synchronize的代码段中。同步的线程可以保证所有同步代码段中的变量都会从内存中读取,而且当线程离开代码块的时候,所有更新后的值都会被写回主内存中,不管这个变量有没有被声明volatile。

Java学习视频分享

Java基础:

Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受

Java项目:

【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏

【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发

Java内存模型与硬件层面内存模型的关系及编程实例 Java内存模型与硬件层面内存模型之间存在一定的关系。Java虚拟机(Java Virtual Machine,JVM)作为Java程序的执行环境,需要将Java内存模型中定义的操作映射到具体的硬件层面的内存操作。Java内存模型通过一些规则和约束确保多线程程序的正确执行,而底层硬件则提供了相应的机制来支持这些规则和约束。Java内存模型定义了多线程程序的规范,而底层的硬件提供了支持这些规范的机制。在本例中,由于t1和t2线程没有同步机制,它们的操作顺序是不确定的,可能导致counter的值不符合预期。 阅读详情

相关推荐

概率整形 Peobabilistic Shaping PS 第一节

概率整形概述 概率整形(Peobabilistic Shaping, PS)是一种针对于调制格式的优化技术,它为光通信通信提供了非常高的灵活性,但不会增加系统复杂性。尤其是光通信中的非线性问题会限制功率,使得PS就像为光通信量身定做的一样。 PS技术能够在不增加发送功率的前提下,获得高频谱效率和传输容量。2016年在使用PS技术的实验中实现了6600km单模光纤的65Tbit/s数据的传输。 到目前位置PS技术的研究主要集中在具有相干检测的单载波光纤传输。 概率整形的基本原理 概率整形技术就是通过在编码前

Explore_OuO的博客 8126

java之jvm系列

jvm系列 第一章:从计算机内存到操作系统看jvm内存模型 前言 jvm虚拟机是java开发依赖的基础,其内存模型与实际机器内存的关系,有助于帮助我们深入理解其原理 一、cpu和机器内存 cpu:负责逻辑计算 内存:负责数据存储 cpu和内存进行交互运行,由于内存和cpu的计算速度有较大的差距,为了提高cpu的利用率,处理器结构加入了高速缓存,将运算需要使用的数据复制到缓存中,让CPU运算可以快速进行,计算结束后再把计算结果从缓存同步到朱内存中,这样就缓解了二者之间的速度差距。但是同

changxiaoxue2014的博客 1110

交换芯片数据通路四大核心微架构深度解析

数据通路是交换芯片性能的物理根基,决定着低延迟、高吞吐与突发承载能力。其本质是在硅片约束下对带宽、时序、功耗与统计复用的系统性权衡。Crossbar提供确定性低延迟但受RC延迟与功耗制约;VOQ通过虚拟队列隔离输出争抢,却引入仲裁复杂度与内存开销;Shared Buffer依托统计复用提升缓存利用率,但面临碎片化与管理策略挑战;Cell Fabric以固定长度cell重构交换粒度,在AI与金融等小包敏感场景实现尾延迟稳定。这些架构并非替代关系,而是面向不同网络不确定性(如流量不对称性、突发强度、包长分布)的

weixin_32667955的博客 189

JVM内存是对应到操作系统内存

根据上面两个图可以看出,JVM内存模型是模仿操作系统内存模型构建的,JVM内存模型和操作系统内存模型是可以一一对应起来的,整个JVM内存模型存储在操作系统的堆中。JVM就是个操作系统,而JVM的方法区,也就相当于操作系统/主机的硬盘区,也叫永久区;而操作系统栈(本地方法栈)和JVM的栈也是一致的,无论是生长方向还是管理方式;JVM堆和操作系统堆在概念上和目标上是一致的,分配内存的方式也是一致的,但JVM堆管理垃圾的方式是GC回收,而操作系统堆则是需要程序员手动释放;至于PC寄存器,无论是在虚拟...

qq_41088031的博客 1989

OpenGL计算着色器工作组设置测试

先看看不同的显卡上工作组的数量情况。 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, data); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, data + 1); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, data...

qq_26328385的博客 1484

【系统分析师】高分论文:论软件需求验证方法及应用

本文以某清算平台建设项目为例,探讨了软件需求验证方法的应用。该项目旨在隔离银行与支付公司的直接通信,满足央行监管要求。作为系统分析师,作者通过需求测试和需求评审两种方法确保需求质量。需求测试采用概念测试用例提前发现问题;需求评审通过正式与非正式形式多方确认需求。项目结合邮件评审、专家会议等方式,最终形成完善的需求文档。平台上线后运行良好,验证了需求管理的重要性。该案例表明,科学的需求验证是项目成功的关键保障。

数据知道的博客 8125

JVM与计算机之间的关系

计算机内存硬件架构 CPU,一台现代计算机拥有两个或多个CPU,其中一些CPU还有多核,从这一点可以看出,在一个有两个或多个CPU的现代计算机上,同时运行多个线程是非常有可能的,而且每个CPU在某一个时刻,运行一个线程是肯定没有问题的,这意味着,如果Java程序是多线程的,在Java程序中,每个CPU上一个线程是可能同时并发执行的。 CPU Refisters(寄存器),每个CPU都包含一系列的寄存器,它们是CPU内存的基础,CPU在寄存器中执行操作的速度远大于在主存上执行的速度,这是因为CPU访问

Linux,Java,SpringBoot,Python,Lua略知一点 915

【Bug已解决】codex: tool call timeout / Function execution exceeds limit — CodeX CLI 工具调用超时解决方案

CodeX CLI 工具调用超时(Bash/文件/MCP)的解决方案,含增加超时、拆分命令、后台运行、避免交互卡住与限制读取。

博客 4204

JVM 堆 VS 本地内存

Java 的类实例一般在 JVM 堆上分配,而 Java 是通过 JNI 调用 C 代码来实现 Socket 通信的,那么 C 代码在运行过程中需要的内存又是从哪里分配的呢?C 代码能否直接操作 Java 堆? 为了回答这些问题,我先来说说 JVM 和用户进程的关系。如果你想运行一个 Java 类文件,可以用下面的 Java 命令来执行 java my.class 这个命令行中的java其实是一个可执行程序,这个程序会创建 JVM 来加载和运行你的 Java 类。 操作系统会创建一个进程来执行这个java

Hajon的专栏 1623

工业质检终极方案:C#上位机融合 YOLO+Blob分析(一站式尺寸测量+缺陷检测)

本次上位机界面严格遵循工业现场操作规范简洁、直观、按钮大、文字清晰、参数可视化调节,操作人员为车间工人/质检员,无需复杂操作,所有功能一目了然。所有控件均为WinForms原生控件,拖拽即可完成布局,无任何自定义控件,开发效率拉满,核心布局永久复用本次实战完成的C#上位机+YOLO+Blob融合质检方案,是工业规则零件全尺寸质检的终极落地方案,完美解决了单一检测方案的所有短板,具备以下不可替代的工业价值。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1343

TIA西门子博途V19安装教程及注意事项

TIA西门子博途V19安装教程及注意事项

Robot_PLC_HMI_Automation 1万+

jvm学习笔记--基本结构

主要来学习jvm的基本结构 知识点1:什么是java虚拟机(你以为你知道,如果你看我下面的例子,你会发现你其实不知道) 第一步:先来写一个类: [code="java"] package test; public class JVMTestForJava { public static void main(String[] args) thro...

yangdingcai的专栏 655

PCL点云算法与项目实战案例汇总(长期更新)

本专栏将深入探讨PCL(点云库)的基础算法,旨在帮助读者掌握点云处理的核心技术。内容涵盖点云的采样、过滤、配准、分割等基础操作,并结合实际案例,展示这些算法在工程中的应用。无论你是初学者还是有一定经验的开发者,都能通过本专栏加深对PCL的理解,提升在三维数据处理领域的技能。

纵马踏花向自由 3007

思考:Java内存模型和硬件内存模型

前一阵在看volatile的原理,看到内存屏障和缓存一致性,发现再往底层挖就挖到了硬件和Java内存模型。这一块是自己似懂非懂的知识区,我一般称之为知识混沌区。因此整理这一篇文章。什么是内存模型(Memory Model)呢?它是系统和程序员之间的规范,它规定了存储器访问的行为,并影响到了性能。并且,Memory Model有多层,处理器规定、编译器规定、高级语。

bigben 1099

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java和硬件交互_Java内存模型

Java内存模型我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范,真实并不存在 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线...

weixin_39940154的博客 228

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java和硬件交互_终于有人把Java内存模型说清楚了

内部原理JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。JMM 的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与 Java 编程中的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,...

weixin_39879674的博客 626

2020版Java并发和多线程教程(十一):Java内存模型(内存模型,硬件内存架构,共享对象的可见性,竞态条件)

翻译:GentlemanTsao,2019-05-07 Java内存模型规定了Java虚拟机使用计算机内存(RAM)的方式。Java虚拟机是整个计算机的一种模型,所以这个模型自然包含一个内存模型,也就是Java内存模型。 要想设计出正确的并发程序,理解Java内存模型非常重要。Java内存模型规定了不同线程用何种方式、以及何时可以看到其他线程写入共享变量的值,以及在必要时如何同步对共享变量的访问。 原始的Java内存模型有很多不足,所以在Java 1.5中Java内存模型得到了完善。而Java8仍沿用了

GentelmanTsao的博客 423

java和硬件交互_[JVM]Java内存模型(一)

Java虚拟机规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。硬件的效率与一致性“让计算机并发的执行某个任务”与“更充分的利用计算机的效能”之间的关系,并不是通常想象的那么简单,其中一个重要的复杂性来源是绝大多数的运算任务并不能只靠处理器“计算”就能完成。处理器至少要与内存交互,如读取运算数据,存储运算结果等,...

weixin_39932300的博客 838

Java JMM(Java Memory Model)全方位深入剖析,直击 HotSpot VM 源码和硬件内存模型!!

摘要:Java内存模型(JMM)是理解Java并发编程的关键,它定义了线程如何访问共享变量。本文剖析了JMM产生的背景,解释了可见性、有序性和原子性三大核心问题。重点阐述了JMM的抽象架构(主内存与工作内存)和happens-before关系的核心规则,并深入分析了内存屏障的实现机制。最后通过HotSpot VM源码展示了内存屏障的具体实现,揭示了JMM底层原理与编译器、处理器的协同工作方式。

NeoLshu的博客 970

Java多线程之Java内存模型

在介绍Java内存模型之前,我们先介绍一下计算机硬件的内存模型,因为JVM的并发和物理机器的并发很相似,甚至JVM并发操作中很多设计都是因为计算机系统的设计引发的。 硬件的内存模型 大家都知道计算机系统处理任务主要是靠处理器(CPU)来进行运算的,而运算中又会涉及到数据,数据在哪呢,数据自然是存储在计算机内存中,所以处理器在运算过程中不可避免的会涉及到与内存的读写交互,比如读取运算所需的数据,存储...

老胡 5704

java内存模型与硬件内存架构

链接: http://tutorials.jenkov.com/java-concurrency/java-memory-model.html 学习小结 java虚拟机和java api构成一个的平台,屏蔽之下的操作系统。而java虚拟机是一个计算机的模型,自然包括他独特的内存模型。 1、java内存模型 从上面可以看出,java内存模型包括栈区、堆区。但是不仅仅这些,还包括方法区和...

千霜的博客 1460

死磕 java同步系列之JMM(Java Memory Model)

简介 Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。 硬件内存模型 在正式讲解Java的内存模型之前,我们有必要先了解一下硬件层面的一些东西。 在现代计算机的硬件体系中,CPU的运算速度是非常快的,远远高于它从存储介质读取数据的速度,这里的存储介质有很多,比如磁盘、光盘、网卡、内存等,这些存储...

彤哥读源码 306

JAVA系列之内存模型(JMM)

Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。Java内存模型是不可见的,它并不是一个真实的东西,它只是一个概念、一个规范。1、硬件内存架构使得必须建立内存模型来保证多线程环境下对共享内存访问的正确性;2、Java内存模型定义了保证多线程环境下共享变量一致性的规则;3、Java内存模型提供了工作内存与主内存交互的八大同步操作和八大规则;

sloveb123的博客 759

从多核硬件架构,看Java内存模型

在了解Java内存模型之前,先来看一下多核硬件架构。 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。 刚开始,还相安无事的,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差...

以爱护甲,爱满枫林。 284

深度解析Java多线程的内存模型

内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操作系统,作为一个操作系统就有内存模型,这就是我们常说的JAVA内存模型。 如果我们想正确的写多线程的并行程序。理解好java内存模型在多线程下的工作方式是及其重要的,这可以帮我们...

WGH100817的博客 131
上一篇: Java基础:Java内存模型
下一篇: Java如何避免空指针异常?
程序媛_小白
博客等级 码龄5年 322粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值