`
guibin
  • 浏览: 363590 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JMM(Java内存模型)中的核心概念

    博客分类:
  • Java
阅读更多
JMM(Java内存模型)中的核心概念
guibin.beijing@gmail.com

在JLS-Java Language Specification的17.4节详细描述了JMM(Java Memory Model),这个文档从语言学和实现JVM的角度讲非常棒,但是对于我们这些应用开发者而言理解其中的细节就有些问题。

本文中不再重复spec中那些正式的细节,下面将列出一些重要的原则和基本的概念,如synchronizes-with,happens-before。这两个概念和面向对象设计中的两个概念has-a,is-a很相似,Happens-before 和 synchronizes-with是用来建立和理解Java 并发的基础。

  • HAPPENS-BEFORE:这个关系用来指示“一段代码在其他代码开始执行前已经完全执行完毕”。
  • SYNCHRONIZES-WITH:这个关系表示一个行为在发生时,它首先把要操作的那些对象同主存同步完毕之后才继续执行。


JMM有以下主要的规则:
  • An Unlock operation on a monitor synchronizes-with later lock operations. 当针对一个监控对象执行解锁操作时,首先synchronizes-with随后的锁操作。即当要解锁时,首先此操作会把它范围内的对象与主存同步,然后解锁,之后才会执行随后其他的锁操作。
  • A write to a volatile variable synchronizes-with later reads of the variable. 当写一个volatile变量时,首先synchronizes-with随后的读此变量的操作。即当写完一个volatile变量后,JVM会首先将此变量与主存同步,然后才执行随后的读volatile变量操作。当然也从主存读了。
  • If an action A synchronizes-with action B, then A happens-before B. 如果时行为A synchronizes-with 行为B,那么行为A happens-before B。
  • If A comes before B in program order within a thread, then A happens-before B. 在同一个线程中如果程序中A在B之前,那么A也一定发生在B之前。
  • The completion of a constructor happens-before the finalizer for that object starts to run. 完成构造函数会发生在此对象的finalizer启动之前,即在对一个对象回收前,此对象必须已经构造完毕。
  • An action which starts a Thread synchronizes-with the first action of the new Thread. 创建了一个新线程的行为synchronizes-with这个线程的第一个操作。即创建完新线程后,JVM首先要把这个线程的信息同步给主存,然后才可以执行这个线程内部的其他操作。
  • Thread.join() synchronizes-with the last (and all other) actions in the thread being joined. Thread.join()函数synchronizes-with被join的线程内部的所有其他操作。即执行Thread.join()之后JVM首先会把信息跟主存同步,然后才会继续执行被join线程内部的其他操作。
  • (Transitivity) If X happens-before Y, and Y happens-before Z, then X happens-before Z. 传递性,即X在Y之前执行,Y在Z之前执行,那么X会在Z之前执行。


前面的两条规则是说:“releases happen before acquires;” (解锁发生在获取锁之前)即:一个线程拿着锁,当写操作完毕后首先释放锁,然后这个锁才能被其他线程获得

以上的这些规则是JMM所做的基本保证,在真正的JVM实现中会有更多更好的规则。

参考资料:
http://www.javabeat.net/articles/298-core-concepts-of-the-java-memory-model-jmm-1.html
2
1
分享到:
评论

相关推荐

    Java内存模型详解JMM.docx

    Java内存模型详解JMM.docx

    深入Java内存模型-JMM

    深入Java内存模型-JMM。。。。。。。。。。。。。。。。。。

    java内存模型jmm

    java内存模型jmm

    深入理解 Java 内存模型

    深入理解 Java 内存模型,由程晓明编著,深入理解java内存模型JMM

    《深入理解JAVA内存模型》PDF

    在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local variables),方法定义参数(java语言规范称之为...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型

    深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...

    深入理解Java内存模型.程晓明(带书签文字版).pdf

    Java 内存模型的抽象 4 重排序 6 处理器重排序与内存屏障指令 7 happens-before 10 重排序 13 数据依赖性 13 as-if-serial 语义 13 程序顺序规则 15 重排序对多线程的影响 15 顺序一致性 19 数据竞争与顺序...

    深入理解java内存模型

    Java内存模型的抽象 重排序 处理器重排序与内存屏障指令 happens-before 重排序 数据依赖性 as-if-serial 语义 程序顺序规则 重排序对多线程的影响 顺序一致性 数据竞争与顺序一致性保证 顺序一致性内存模型 同步...

    JMM(Java内存模型)及Volatile底层实现原理.md

    Java内存模型及Volatile底层实现原理

    JMM内存模型图

    Java运行时内存模型图

    深入理解Java内存模型(经典).rar

    深入理解Java内存模型

    JMM(Java 内存模型详解)

    Java开发

    java内存模型JMM(Java Memory Model)1

    由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定

    java内存模型的介绍和说明

    介绍java的内存管理方式和特点 1.JMM 简介 2.堆和栈 3.本机内存 4.防止内存泄漏

    Java内存模型案例讲解.docx

    Java线程之间的通信由Java内存模型简称JMM(Java Memory Mode)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM是这样定义线程和主内存之间的抽象关系的:线程之间的共享变量...

    JAVA内存模型

    Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。而且Java语言最大的特点就是废除了指针,把程序员从痛苦中解脱出来,不用再考虑内存使用和管理方面的问题。 可惜世事总不尽如人意,虽然JMM设计...

    深入理解Java内存模型

    Agenda: •什么是Java内存模型JMM •内存可见性 •有序性 •指令重排序 •内存屏障 •顺序一致性与Happens-before规则 •volatile, synchronized, 原子变量,锁, final的原理

    Java内存模型JMM浅析

    Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、...

    Java理论与实践:修复Java内存模型1

    关于同步和线程安全的许多底层混淆是Java内存模型的一些难以直觉到的细微差别。本文还介绍了JMM有一些严重的缺点,如果正确地编写并发的类太困难的话,那么许多并发的类不能按预期工作,并且这是平台中的一个缺点。...

Global site tag (gtag.js) - Google Analytics