美文网首页
JVM之内存模型

JVM之内存模型

作者: taoguan | 来源:发表于2019-11-03 07:13 被阅读0次

前言

每一个线程有一个工作内存。工作内存和主存独立。工作内存存放主存中变量的值的拷贝。


image
  • 当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;第二,由工作内存执行的相应的load操作;
  • 当数据从工作内存拷贝到主内存时,也出现两个操作:第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作。

每一个操作都是原子的,即执行期间不会被中断

对于普通变量,一个线程中更新的值,不能马上反应在其他变量中。如果需要在其他线程中立即可见,需要使用volatile关键字作为标识。

image

原子性、可见性、有序性

原子性

由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write。我们大致可以认为基本数据类型的访问读写是具备原子性的。
如果应用场景需要一个更大范围的原子性保证,Java内存模型还提供了lock和unlock操作来满足这种需求,尽管虚拟机没有把lock和unlock操作直接开放给用户,但是却提供了更高层次的字节码指令monitorenter和monitorexit来隐式地使用这两个操作,这两个字节码指令反映到Java代码中就是同步块---synchronized关键字,因此在synchronized块之间的操作也具备原子性。

可见性

一个线程修改了变量,其他线程可以立即知道。

保证可见性的方法:

  • volatile:保证新值能立即同步到主内存,以及每次使用前立即从主内存刷新。
  • synchronized (unlock之前,写变量值回主存)
  • final(一旦初始化完成,其他线程就可见)

有序性

在本线程内,操作都是有序的;
在线程外观察,操作都是无序的。(指令重排 或 主内存同步延时)

指令重排

image

指令重排破坏了线程间的有序性


image

保证有序性方法:

  • volatile :禁止指令重排序
  • synchronized :一个变量在同一时刻只允许一条线程对其进行lock操作。

内存屏障(memory barriers)

内存屏障的作用 :

  • 阻止屏障两侧的指令重排序
  • 强制刷新主内存数据,以及让缓存中相应的数据失效。
    Java的内存屏障有的四种,LoadLoad,StoreStore,LoadStore,StoreLoad


先行发生原则

程序顺序原则:一个线程内保证语义的串行性.对于单线程来讲,必须保证重排后的结果与重排前一致。
volatile规则:volatile变量的写,先发生于后续对这个变量的读.这保证了volatile变量的可见性.
监视锁规则:对于一个锁的解锁,先发生于随后对这个锁的加锁. 否则随后的加锁将会失败.
传递性:A先于B,B等于C,那么A必然先于C.
线程启动规则:Thread对象的start()方法先发生于此线程的其他任意动作。
线程终止规则:线程的所有操作都先发生于对此线程的终止检测,可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。
线程中断规则:对线程interrupt()方法的调用先发生于被中断线程的代码检测到中断时事件的操作。
对象终结规则:一个对象的初始化完成(构造函数执行结束)先发生于它的finalize()方法的开始

相关文章

  • JVM内存模型(jvm 入门篇)

    概述 jvm 入门篇,想要学习jvm,必须先得了解JVM内存模型,JVM内存模型,JVM内存模型,JVM内存模型,...

  • JVM

    JVM之内存模型JVM之对象定位与访问JVM之Java垃圾回收机制JVM之类加载

  • JVM

    栈容量由-Xss指定深入理解JVM—JVM内存模型 JVM内存模型和JVM参数的关系

  • [Java多线程编程之八] Java内存模型

    一、Java内存模型 == JVM内存模型?   很多人都会认为Java内存模型就是JVM内存模型,但实际上是错的...

  • JVM问题及解答

    常见JVM问题 JVM内存模型,GC机制和原理。注意JVM内存模型与Java内存模型(JMM)不是同一个东西。JV...

  • JVM内存结构和Java内存模型

    最近看到两个比较容易混淆的概念:JVM内存结构和Java内存模型 JVM内存结构JVM内存结构或者说内存模型指的是...

  • 高效并发

    从JVM的角度看一下Java与线程,内存模型,线程安全以及JVM对于锁的优化 硬件内存模型与JVM内存模型 硬件的...

  • jvm

    1.5.1JVM的内存模型 首先我们来了解一下JVM的内存模型的怎么样的: 基于jdk1.8画的JVM的内存模型-...

  • JVM基础知识点

    1. 内存模型以及分区,需要详细到每个区放什么(共分为5个)。 JVM内存模型及分区jvm内存模型和内存分配 程序...

  • 面试系列之JVM

    1.jvm内存模型 jvm内存模型主要有运行时期模型和非运行时期两部分组成,通常说的jvm内存模型是指运行时期内存...

网友评论

      本文标题:JVM之内存模型

      本文链接:https://www.haomeiwen.com/subject/fukkbctx.html