`
guibin
  • 浏览: 366203 次
  • 性别: 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内存模型 pdf 超清版

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了程序中各个线程如何访问和修改共享变量,以及如何确保数据的一致性。深入理解Java内存模型对于编写高效的并发程序至关重要。本文...

    深入理解Java内存模型

    Java内存模型是并发编程中一个至关重要的概念,它定义了共享变量的访问规则,以及这些变量如何在多线程环境下进行读写操作。在深入理解Java内存模型之前,我们需要先了解并发编程模型的分类,然后掌握Java内存模型的...

    深入理解java内存模型

    Java内存模型主要涉及以下几个核心概念: 1. **主内存**:所有线程共享的数据存储区域,包括类的静态变量、实例变量等。这些变量在主内存中是唯一的,但每个线程都有自己的工作内存。 2. **工作内存**:每个线程...

    深度剖析java内存模型

    Java内存模型(Java Memory Model,简称JMM)是Java虚拟机(JVM)规范中定义的一种内存模型,它涉及了线程之间共享变量的可见性问题。在并发编程中,理解Java内存模型对于编写正确的多线程程序至关重要。 首先,...

    Java内存模型的历史变迁

    Java内存模型(Java Memory Model,简称JMM)作为Java并发机制的核心,其设计理念直接影响到程序的性能与可靠性。本文将探讨Java内存模型从早期版本到JDK 5的重大变革,并重点介绍这一变迁背后的动机及其对Java开发...

    java内存模型文档

    这些文档如"Java内存模型.docx"、"Java内存模型2.docx"、"深入Java核心 Java内存分配原理精讲.docx"、"java内存模型.pdf"将深入探讨这些概念,帮助开发者更深入地理解Java内存模型及其在实际编程中的应用。...

    深入理解 Java 内存模型

    Java 内存模型(Java Memory Model,简称 JMM)是 Java 平台中关于线程如何访问共享变量的一套规则,它定义了线程之间的内存可见性、数据一致性以及指令重排序等关键概念,对于多线程编程和并发性能优化至关重要。...

    Java内存模型(JMM)深度解析:原理、特性与代码实践

    Java内存模型(Java Memory Model,简称JMM)是Java并发编程中的核心概念,它定义了Java程序中多线程间共享变量的访问规则。理解JMM对于编写正确、高效的并发程序至关重要。本文将深入探讨JMM的原理、特性以及如何在...

    Java 内存模型

    Java内存模型(Java Memory Model,JMM)是Java平台中的一种规范,它定义了线程如何访问和修改共享变量,以及在多线程环境中如何保证数据一致性。JMM的主要目标是解决多线程环境下的可见性、有序性和原子性问题。 ...

    三问JMM--有关JVM内存模型的PPT

    近期,在诚信通开源研究小组的专题学习分享会上,我们针对Java内存模型(JMM)进行了深入探讨,现将JMM相关的一些核心概念进行梳理,以便更好地理解和把握JMM的基本原理。 #### 第一问:JMM是干什么的? JMM (Java ...

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

    Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它描述了在多线程环境下,如何保证共享数据的正确性。深入理解JMM对于编写高效、线程安全的Java代码至关重要。 首先,我们要...

    Java内存模型知识汇总

    Java内存模型(JMM)是Java虚拟机(JVM)规范的一部分,用于定义多线程环境下共享变量的访问规则和操作的可见性。本文将对Java内存模型进行知识汇总,帮助读者更好地理解和掌握相关知识点。 首先,内存模型的概念是...

    java线程-Java内存模型

    Java线程-Java内存模型是Java并发编程中的关键概念,它描述了多个线程如何共享和访问内存资源,以及如何保证数据的一致性和安全性。Java内存模型(JMM)是Java虚拟机规范的一部分,用于定义程序中各个线程对共享变量...

    Java内存模型(JMM):并发编程的基石

    Java内存模型(JMM)是并发编程中的核心概念,它通过定义线程与主内存之间的交互规则,确保了多线程程序的正确性和内存的一致性。理解JMM的工作原理和特性,对于编写高效、可靠的并发程序至关重要。通过使用volatile...

    JAVA内存模型

    主内存是JMM的核心概念之一,它存储着程序中的所有变量(包括但不限于实例字段、静态字段和数组元素)。主内存对所有线程是共享的。 ##### 2. 工作内存(Working Memory) 每个线程都有自己的工作内存,用于存储该...

    java内存模型深入了解

    在Java中,内存模型主要涉及到以下几个核心概念: 1. **工作内存(Working Memory)**:每个线程都有自己的工作内存,存储从主内存中拷贝过来的变量副本。工作内存中的数据只能被当前线程读写,不同线程间的工作...

    Java内存模型1

    Java内存模型(JMM,Java Memory Model)是Java并发编程中的关键概念,它定义了程序中各个变量(包括实例域、静态域和数组元素)之间的关系,以及它们在实际计算机系统中的存储和读取方式。相比C和C++,Java具有一个...

    从 CPU 讲起,深入理解 Java 内存模型!.doc

    Java 内存模型(Java Memory Model,JMM)是 Java 平台规范的一部分,它定义了程序中各个线程如何访问和修改共享变量的规则,确保多线程环境下的正确性。JMM 主要是为了处理并发编程中可能出现的数据一致性问题,...

    什么是Java内存模型.docx

    Java 内存模型(JVM Memory Model)是Java虚拟机规范中定义的一种抽象概念,它描述了Java程序中各种变量的访问规则,包括线程如何读取和写入共享变量,以及如何处理并发情况下的数据一致性。Java内存模型是建立在...

Global site tag (gtag.js) - Google Analytics