`
lg70124752
  • 浏览: 61583 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

深入理解java虚拟机学习笔记(九)--java内存模型与线程

    博客分类:
  • jvm
阅读更多
第十二章 java内存模型与线程
1、主内存与工作内存
java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与java编程中所主的变量略有区别,它包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不存在竞争问题。java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。主内存是堆,工作内存是栈,也可以说主内存是硬件内存,工作内存优先存储于寄存器和高速缓存中。
2、对于volatile型变量的特殊规则
volatile变量对所有线程是立即可见的,对volatile变量所有的写操作乾能立刻反应到其它线程中,换句话说,volatile变量在各个线程中是一致的。使用-XX:+PrintAssembly参数输出反汇编来分析并发问题更加严谨些。
volatile屏蔽指令重排序的主义在jdk1.5中才被完全修复,此前的JDK中即使将变量声明为volatile也仍然不能完全避免重排序所导致的问题(主要是volatile变量前后的代码仍然存在重排序问题),这点也是在jdk1.5之前的java中无法安全地使用DCL(双锁检测)来实现单例模式的原因。
3、对于long和double型变量的特殊规则
java内存模型要求lock、unlock、read、load、assign、use、store和write这八个操作都具有原子性,但是对于64位的数据类型(long和double),在模型中特别定义了一条宽松的规定:允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行,即允许虚拟机实现选择可以不保证64位数据类型的load、store、read和write这四个操作的原子性,这点就是所谓的long和double的非原子性协定。但虚拟机把64位数据的读写操作作为原子操作来对待。
4、等待发生原则
先行发生是java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到,"影响"包括修改了内存中共享变量的值、发送了消息、调用了方法等。
Java内存模型下的“天然的”先行发生关系:
A、程序次序规则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。
B、管和锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。
C、volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的“后面”同样是指时间上的先后顺序。
D、线程启动规则:Thread对象的start()方法先行发生于此线程的每一个动作。
E、线程终止规则:线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。
F、线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。
G、对象终结规则:一个对象的初始化完成先行于它的finalize方法的开始。
H、传递性:如果操作A先行发生于操作B,操作B先行发生于操作C,寻就可以得出操作A先行发生操作C的结论。
分享到:
评论

相关推荐

    深入理解Java虚拟机学习笔记借鉴.pdf

    Java 虚拟机(JVM)自动内存管理机制 Java 虚拟机(JVM)自动内存管理机制是 Java 语言的一大特色,它使得 Java 程序员无需手动管理内存,从而提高了开发效率和程序稳定性。JVM 自动内存管理机制主要通过 JVM 的...

    学习深入理解Java虚拟机的前几章笔记

    ### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...

    JVM:深入理解Java虚拟机 - 学习笔记

    《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...

    理解虚拟机--有笔记版

    除了上述提到的基础知识点外,《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》这本书籍还深入探讨了JVM的性能调优、并发编程、以及各种高级特性的具体应用。比如,对于性能调优,书中讲解了如何根据不同的...

    JAVA学习经典笔记-----2

    6. **高性能:** Java虚拟机(JVM)通过即时编译(JIT)技术提高程序的执行速度。 7. **多线程:** Java内置对多线程的支持,简化了并发程序的开发。 #### 三、Java开发环境配置 1. **Linux环境:** - 配置`JAVA_HOME...

    java虚拟机源码学习-UnderstandingTheJVM:深入理解Java虚拟机(周志明)源码及学习笔记

    《深入理解Java虚拟机》是Java开发者们深入探讨Java运行机制的经典之作,作者周志明以其深入浅出的讲解方式,揭示了Java虚拟机(JVM)的工作原理。本资源包含该书第三版的源码分析及学习笔记,旨在帮助读者更透彻地...

    深入java虚拟机读后笔记

    ### 深入理解Java虚拟机(JVM)的关键知识点 #### 一、Java与Java虚拟机的关系 Java语言的设计者们为了使Java程序能够跨平台运行,引入了一个概念——Java虚拟机(JVM)。简单来说,Java源代码在编译成`.class`...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

    瑜琅java学习笔记

    瑜琅的Java学习笔记涵盖了Java的基础概念与核心特性,从起源到高级特性均有涉及。以下是对该学习笔记各部分的深入解析: #### 1. Java起源 ##### 1.1 发展背景 - Java的诞生源于Sun Microsystems的一个项目,目标...

    韩顺平编写的java学习笔记(全)

    韩顺平编写的《Java学习笔记》全面涵盖了Java的基础知识和发展方向,不仅适合初学者入门,也适合进阶开发者深入了解Java的各项技术栈。通过对本书的学习,读者能够掌握Java的核心概念、编程技巧以及实际应用场景,为...

    java虚拟机源码-openjdk7:openjdk7源码(深入理解java虚拟机,读书笔记)

    本资源是关于OpenJDK7源码的分析和学习资料,旨在帮助开发者深入理解Java虚拟机的工作原理。 首先,我们来了解一下Java虚拟机的主要组件和功能: 1. **类加载器**:负责加载Java字节码文件(.class),将其转换为...

    java实战经典学习笔记

    ### Java实战经典学习笔记知识点概览 #### 一、Java概述及开发环境搭建 - **Java概述** - Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年发布。 - Java的设计目标是“一次编写,到处运行”,这...

    逐步深入的java学习笔记

    ### 逐步深入的Java学习笔记知识点总结 #### 一、Java环境配置 1. **JAVA_HOME**: 配置JDK的目录。这是Java环境的基本配置之一,用于指示系统JDK安装的位置。 - **Linux系统**: ```bash JAVA_HOME=/opt/jdk1.5.0...

    《java学习》-Java 学习笔记.zip

    本压缩包文件“《java学习》-Java 学习笔记.zip”包含了丰富的学习资源,帮助初学者和进阶者深入理解Java编程。 1. **Java基础知识** - **语法**:Java的基础语法包括变量、数据类型、运算符、流程控制语句(如if-...

    Java JDK 7学习笔记 PDF

    这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些核心知识点的详细阐述: 1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过...

    达内core_java学习笔记

    Java虚拟机(JVM)是Java程序的运行环境,理解JVM的工作原理和内存模型对于优化程序性能很有帮助。 以上就是“达内Core Java学习笔记”中涉及的主要知识点。通过深入学习和实践,初学者可以逐步建立起坚实的Java...

    java se学习笔记

    【Java SE学习笔记】是针对Java...以上就是【Java SE学习笔记】可能覆盖的主要知识点,这些内容对于初学者来说是构建Java编程基础的基石,通过深入学习和实践,能够为后续的Java EE开发或Android开发奠定坚实的基础。

    良葛格java学习笔记

    8. **JVM原理**:简要介绍Java虚拟机的工作原理,包括内存模型、类加载机制、垃圾收集器和调优策略。 9. **网络编程**:涉及Socket编程,讲解如何建立客户端和服务端通信,以及套接字和服务器套接字的使用。 10. *...

Global site tag (gtag.js) - Google Analytics