Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你碰到了半吊子面试官,那就要恭喜你了。Java 内存模型比 JVM 内存结构复杂很多,Java 内存模型有一个规范叫:《JSR 133 :Java内存模型与线程规范》,里面的内容很丰富,如果你没看过的话,我建议你看一下。今天我们就简单的来聊...
在JSR 133 Java Memory Model FAQ中,它指出the new memory model places stricter constraints on reordering ofvolatile field accesses with other field accesses, volatile or not,anything that was visible to thread A when it writes to volatile fieldf becomes visible to thread B when it reads f它还提供了如何使用易失性字段的示例class VolatileExample {int x = 0;volatile boolean v = false;public void writer(...
在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型。它们的答案是一致的:能够让我们更好的理解底层原理,写出更高效的代码。 就Java内存模型而言,它是深入了解Java并发编程的先决条件。对于后续多线程中的线程安全、同步异步处理等更是大有裨益。 硬件内存架构 在学习Java内存模型之前,先了解一下计算机硬件内存模型。我们多知道...
java虚拟机管理的内存分为五大区域: 方法区、堆 ;虚拟机栈、本地方法栈、程序计数器 程序计数器:线程私有、记录当前线程的行号指示器,内存模型中唯一没有OOM错误的区域 虚拟机栈:方法执行时创建,存储局部变量表、操作数栈、动态链接、方法返回地址;先进后出;局部变量表的大小在编译时期就确认了;当请求的栈深度大于当前的栈深度时,报StackOverflowError;栈空间可以动态扩展,当无法申请到足够的空间时,报OOM错误。 本地...
经常有人会有这么一个疑惑,难道 Java 开发就一定要懂得 JVM 的原理吗?我不懂 JVM ,但我照样可以开发。确实,但如果懂得了 JVM ,可以让你在技术的这条路上走的更远一些。JVM 的重要性 首先你应该知道,运行一个 Java 应用程序,我们必须要先安装 JDK 或者 JRE 。这是因为 Java 应用在编译后会变成字节码,然后通过字节码运行在 JVM 中,而 JVM 是 JRE 的核心组成部分。 优点 JVM 不仅承担了 Java 字节码的分析(JIT compiler)和...
线程的同步 保证多线程安全访问竞争资源的一种手段,避免多个线程同时修改一个资源,导致资源的不正确性。 相关概念:什么是竞争资源 什么时候需要同步 要怎样进行同步将竞争资源标为private 将涉及到静态资源的方法或块用synchrized关键字修饰同步方法 模拟银行转账功能 package cn.domin.threadr.sync; public class Thransfer {User u = new User();u.setBalance(10000);u.setCode(0x08);ATMThread a1 = new ATMThread("ATM1", ...
首先,这两者是完全不同的概念,绝对不能混为一谈。 1.什么是Java内存模型? Java内存模型是Java语言在多线程并发情况下对于共享变量读写(实际是共享变量对应的内存操作)的规范,主要是为了解决多线程可见性、原子性的问题,解决共享变量的多线程操作冲突问题。 多线程编程的普遍问题是:所见非所得 无法肉眼检测程序的准确性 不同的运行平台表现不同 错误很难复现故JVM规范规定了Java虚拟机对多线程内存操作的一些规则,主要集中体...
在了解什么是 Java 内存模型之前,先了解一下为什么要提出 Java 内存模型。 之前提到过并发编程有三大问题CPU 缓存,在多核 CPU 的情况下,带来了可见性问题 操作系统对当前执行线程的切换,带来了原子性问题 译器指令重排优化,带来了有序性问题为了解决并发编程的三大问题,提出了 JSR-133,新的 Java 内存模型,JDK 5 开始使用。 那么什么是 Java 内存模型呢? 现在说的 Java 内存模型,一般是指 JSR-133: Java Memory Model ...
Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。 如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。 原始的Java内存模型存在一些不足,因此Java内存模型在Java1.5时被重新修订。这个...
前言首先我们在了解java内存模型之前先看一下计算机内存模型,理解了计算机内存模型的话后面在看JMM就会简单的多。计算机内存计算机是由CPU、主存、磁盘等组成的(简单引出问题熬)我们都知道计算机执行程序的指令都是由CPU来执行的,执行的时候是要处理数据的,这些数据通常存储在主存中。如图所示,这时候问题来了,CPU的执行速度越来越快,然后内存倒是没什么进展,这样的话CPU的读写操作就会非常耗时,效率不就很低了?所以这个时...
前言首先我们在了解java内存模型之前先看一下计算机内存模型,理解了计算机内存模型的话后面在看JMM就会简单的多。计算机内存计算机是由CPU、主存、磁盘等组成的(简单引出问题熬)我们都知道计算机执行程序的指令都是由CPU来执行的,执行的时候是要处理数据的,这些数据通常存储在主存中。如图所示,这时候问题来了,CPU的执行速度越来越快,然后内存倒是没什么进展,这样的话CPU的读写操作就会非常耗时,效率不就很低了?所以这个时...
1、基本概念 程序:代码,是为了完成某一个任务,代码序列(静态的概念) 进程:程序在某些数据上的一次运行(动态的概念) 线程:一个进程可能包含一个或多个线程(占有资源的独立单元) 2、JVM与线程 JVM什么时候启动? 类被调用是时启动JVM,JVM线程 启动 其他线程(mian…) 3、JVM内存模型方法区:类信息,常量,static变量,JIT (利用反射加载类) 堆:实例对象 VM stack:Java方法在运行时的内存模型 native method stack:J...
原文链接:http://ifeve.com/java-memory-model-2/ 转载自并发编程网 – ifeve.com本文链接地址: 深入理解Java内存模型(二)——重排序数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读...
java线程内存模型JMM 线程共享变量存储在主内存中,每个线程都有自己的本地内存,内部存有共享变量的副本,本地内存是一个抽象概念,它是缓存、寄存器、硬件和编译器优化的合集。 保证内存可见性:内存模型的happens-before规则,也就是前一个操作执行的结果对后一个操作可见(并不保证前一个操作在后一个操作前执行,这是java在首先保障结果正确的前提下做出的允许编译器和硬件优化让步),要求happens-before规则的场景有:同一个...
还是我们上次的图,我们上次大概讲解了类加载子系统的执行过程,验证,准备,解析,初始化四个过程。还有我们的双亲委派机制。 我们这次来说一下运行时内存模型。上一段小代码。public class Main {public int compute() {int a = 11;int b = 22;int c = a + b / 2;return c;}public static void main(String[] args) {Main main = new Main();int result = main.compute();System.out.println(result);System.out.println(2);} }运...