`
flyingdutchman
  • 浏览: 358954 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HotSpot JVM虚拟机:JAVA内存模型与volatile变量

阅读更多
       JAVA虚拟机规范中试图通过“JAVA内存模型”来屏蔽掉各种硬件和各种操作系统队内存访问的差异,让JAVA程序在各种系统平台下都能有一致的并发效果,“一次书写,处处运行”。
       JAVA内存模型的主要目标:定义程序中各个变量的访问规则,就是在JVM中如何将变量存储到内存和如何从内存中取出变量。这里的变量专指可以被多个线程共享的、存在竞争可能的的实例字段、静态变量和构成数组对象的元素,不包括线程私有的局部变量和方法参数。
       JAVA内存模型规定了所有变量都在主内存中存储,每个线程都有自己私有的工作内存。工作内存中保存了该线程使用到的变量,这些变量是主内存中对应变量的副本的拷贝,线程对象两种的操作都必须在工作内存中进行,而不能直接读写主内存中的变量。工作内存是相互独立的,即线程A不能直接读取线程B的工作内存,同样,线程B也不能直接读取线程A的工作内存;线程间变量的值只能通过主内存来完成。       
        线程、内存和主内存的关系如下图所示:

        主内存和工作内存的交互,即如何讲一个变量从主内存拷贝到工作内存、如何从工作内存同步到主内存,JAVA内存模型定义了以下8种操作:
        lock(锁定):将一个变量标识为被一个线程独占状态。
        unlock(解锁):将一个变量从独占状态释放出来,释放后的变量才可以被其他线程锁定。
        read(读取):将一个变量的值从主内存传输到工作内存中,以便随后的load操作。
        load(载入):把read操作从主内存中得到的变量值放入工作内存的变量的副本中。
        use(使用):把工作内存中的一个变量的值传给执行引擎,每当虚拟机遇到一个使用到变量的指令时都会使用该指令。
        assign(赋值):把一个从执行引擎接收到的值赋给工作内存中的变量,每当虚拟机遇到一个给变量赋值的指令时,都要使用该操作。
        store(存储):把工作内存中的一个变量的值传递给主内存,以便随后的write操作。
        write(写入):把store操作从工作内存中得到的变量的值写到主内存中的变量。
        JAVA内存模型只要求read和load、sotre和write这两对操作必须按顺序执行,但没有保证连续执行,也不允许其中其中之一单独执行。
       
        JAVA内存模型的原子性、可见性和有序性
        JAVA内存模型主要是建立在如何处理java并发过程中的原子性、可见性和有序性这三个特征的:
        原子性:java内存模型可以直接通过read、load、assign、use、store和write这六个原子性变量操作来保证。在更大的范围内java是通过lock和unlock操作来满足这种要求,反映在代码层面就是synchronized关键字来保证synchronized块儿中的操作也具有原子性。
        可见性:就是指当一个线程在工作内存中修改了共享的变量的值后,其他线程能够立即“看到”这个修改。
        有序性:Java语言提供了volatile和synchronized两个关键字来保证线程间操作的有序性。在java中,有序性可以总结为:如果在本线程内观察,所有操作都是有序的;如果在一个线程内观察另一个线程,所有操作都是无序的。前半句讲的是“线程内表现为串行语义”,后半句指“指令重排序”和“工作内存和主内存同步延迟”。

        “现行发生(happens-before)原则”
        “happens-before”先行发生是JAVA内存模型中定义的两项操作之间的偏向关系。现行发生原则是判断数据是否存在竞争,线程是否安全的主要依据。可以这样理解:如果说操作A先行发生于操作B,那么操作A产生的影响线程B能观察到,这个“影响”包括修改了内存中共享变量的值、发消息、调用方法等。

     
         volatile关键字
         volatile是Java虚拟机提供的最轻量级的同步机制,JAVA内存模型对volatile专门定义了一些访问规则。
         当一个变量被定义为volatile后,该变量就拥有了两种特性:
         1、保证了此变量在内存模型中对所有共享该变量的现成的“可见性”,这个“可见性”是指当一个线程修改了一个volatile变量的之后,新值对于其他线程来说是得知的;而普通的变量不能做到该点,变量值在线程间的同步必须通过主内存来完成,就是说如果线程A修改了一个普通的变量的值,然后向主内存中回写,两外一个线程B在线程A回写完后再从主内存读取该变量,新值才会对线程B可见。
         2、禁止指令重排序优化。由于java是乱序执行的,普通的变量紧会保证在程序中所有依赖赋值结果的地方正能获得正确的结果,但是不能保证变量赋值的顺序与代码中的顺序一致,这也是JAVA内存模型中描述的“线程内表现为串性的语义”。而volatile是禁止指令重排序优化的。
         volatile定义的变量并不能保证JAVA内存模型的原子性,但它和synchronized关键字一起可以保证JAVA内存模型的有序性。
  • 大小: 54 KB
分享到:
评论

相关推荐

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    JVM内存结构、Java内存模型、Java对象模型1

    Java内存模型(JMM)与JVM内存结构不同,它是针对多线程环境下内存访问的抽象模型。JMM确保在多线程环境下,共享变量的读写操作具有正确的顺序和可见性,通过volatile、synchronized等关键字来实现这一目标。JMM关注...

    jvm.rar_JAVA虚拟机_jvm

    Java内存模型(JMM)对并发编程提供了规范,如volatile、synchronized关键字的实现都依赖于JMM。 6. **优化技术**:JVM包含多种优化策略,如动态编译(JIT,Just-In-Time)将频繁执行的字节码编译成机器码,提高...

    Java虚拟机规范(Java SE 7)1

    6. **内存模型与并发**:Java内存模型(JMM)定义了线程之间共享变量的访问规则,确保正确同步和内存可见性。它涉及到volatile变量、synchronized关键字、final字段的语义以及线程交互的内存操作。 7. **异常处理**...

    解密Java虚拟机(带目录)

    5. **内存模型(Java Memory Model, JMM)**:定义了线程之间的共享变量如何交互和可见性。 volatile关键字、synchronized和final关键字都在此模型中扮演重要角色。 6. **类加载与双亲委派模型**:为了保证类加载的...

    java虚拟机学习

    volatile、synchronized、final关键字以及CAS操作都是基于内存模型实现的并发保证。 通过对这些Java虚拟机的关键知识点的理解和实践,开发者能更好地编写高性能、可扩展的Java应用,并解决内存管理和并发等问题。...

    深入Java虚拟机(原书第二版清晰版)

    7. **内存模型与线程**:Java内存模型定义了多线程环境下的数据访问规则,确保可见性和一致性。同步机制如synchronized和volatile关键字是实现线程安全的关键。 8. **异常处理**:Java的异常处理机制通过try-catch-...

    Java 虚拟机规范.pdf

    6. **内存模型**:Java内存模型定义了线程之间如何共享和访问变量,包括主内存和工作内存的概念,以及 volatile、synchronized 和 final 关键字的角色。 7. **异常处理**:Java中的异常是通过异常处理表来实现的,...

    Java内存模型与JVM运行时数据区的区别详解

    Java内存模型与JVM运行时数据区的区别详解 Java内存模型是Java语言在多线程并发情况下对于共享变量读写的规范,主要是为了解决多线程可见性、原子性的问题,解决共享变量的多线程操作冲突问题。Java内存模型是为了...

    JVM基础.doc

    - **volatile变量**:声明为volatile的变量可以确保对变量的修改对其他线程可见,但并不能保证原子性操作。 综上所述,理解JVM的基础知识对于深入学习Java技术至关重要。掌握上述内容可以帮助开发者更好地理解和...

    深入java虚拟机(原书第2版)

    7. **内存模型与并发**:Java内存模型(JMM)规定了线程间共享变量的访问规则,确保正确性。理解锁、同步、volatile、原子变量类等并发工具的原理和使用是优化多线程程序的关键。 8. **异常处理**:Java的异常处理...

    实战JAVA虚拟机

    Java内存模型(JMM)定义了线程如何访问共享变量,以及如何保证内存可见性。volatile、synchronized和final关键字都是JMM的重要概念,理解它们的作用有助于编写正确并发代码。 十、JVM未来发展 随着技术的进步,JVM...

    java深度历险

    - 主内存与工作内存:Java内存模型(JMM)定义了线程如何共享数据,以及如何保证数据一致性。 - volatile、synchronized关键字:理解它们在并发编程中的作用,如何保证可见性和有序性。 - CAS(Compare and Swap...

    Java 虚拟机规范

    7. 多线程:JVM支持多线程并发执行,线程之间的同步和通信由监视器锁、volatile变量和synchronized关键字来保证。 8. 调优与性能监控:JVM提供了一系列的命令行工具和API,如jconsole、jmap、jhat等,用于监控和...

    openjdk8u60+jvm jdk源码+jvm源码

    6. **并发与多线程(Concurrency and Multithreading)**:Java 提供了丰富的并发工具类,如 `java.util.concurrent` 包,以及 synchronized 关键字、volatile 变量和 Lock 接口等机制,用于支持多线程编程。...

    Java虚拟机

    第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁...

    Java面试题虚拟机片源码资料

    - volatile、synchronized关键字与内存屏障的关系。 - Happens-Before原则,确保并发执行的正确性。 5. **JVM调优**: - 使用JDK自带的JConsole、VisualVM等工具监控JVM状态。 - 调整堆大小、新生代和老年代的...

    JVM相关文档资料.rar

    8. **JVM内存模型**:Java内存模型(JMM)定义了线程如何访问共享变量,确保并发程序的正确性。 volatile、synchronized、final等关键字与JMM密切相关。 9. **线程与并发**:JVM支持多线程,线程间的通信和同步是...

    深入JAVA虚拟机第二版

    1. **内存管理**:书中详细阐述了JVM内存模型,包括堆内存、栈内存、方法区、程序计数器和本地方法栈等组成部分。它讨论了对象的生命周期,如何分配与回收内存,以及如何避免内存泄漏,这对于理解和解决性能问题至关...

    Inside the Java Virtual Machine

    《深入理解Java虚拟机》是Java开发者不可或缺的知识宝典,它揭示了Java虚拟机(JVM)的工作原理,帮助我们优化程序性能,提升开发技能。本文将深入探讨JVM的相关知识点,包括其架构、内存模型、类加载机制、指令集、...

Global site tag (gtag.js) - Google Analytics