`
greemranqq
  • 浏览: 966445 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

JAVA 内存模型(一) 概念理解

    博客分类:
  • JVM
阅读更多

      学习JAVA内存模型,可以帮助我们理解数据在内存中的分布、变化等细节,让我们在多线程开发中,拥有

对数据更强的掌控力,能让我们开发出更稳定、更优秀的程序。

 

一、内存模型定义

     A memory model describes, given a program and an execution trace of that program, whether the execution trace is a legal execution of the program. For the Java programming language, the memory model works by examining each read in an execution trace and checking that the write observed by that read is valid according to certain rules;

      大概意思是:内存模型是描述一个程序的执行路径是否合法。对于JAVA 语言来说,内存模型是检查每一次的读写操作,根据定义的规则,判定这些操作是否有效。

      这里仅仅是定义了一个规范,是一种抽象的概念。

       

 

二、目标:

    JAVA 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量(Variavle) 于JAVA编程中所说的变量有所区别,它包括了实例字段、静态字段、和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,也就不会存在竞争问题。

 

 

三、主内存与工作内存

    JAVA 内存模型中主内存和工作内存的概念,有点类似于电脑里面的内存和高速缓存的概念,线程使用的数据库在主内存中,然后对数据的操作,为了获得更快的速度,会放到寄存器和高速缓存中。JAVA 内存模型规定所有的变量都存储在主内存中,而工作内存会存放用到的变量的副本拷贝,线程对所有变量的操作都在工作内存中进行,而且不同线程不能访问对方工作内存中的变量,只能通过主内存进行进行。这里通过图例,很好明白:

    

 

 

 

 

四、内存间的交互操作

    主内存和工作内存之间的具体交互协议,即变量如何从主内存到工作内存,然后又从工作内存回到主内存的实现细节,JAVA 内存模型定义了以下8中操作完成,虚拟机实现时,必须保证下面的每一种操作都是原子的、不可分割的(对于double long 类型在有些平台上允许例外)。

    1.lock(锁定):作用于主内存的变量,它把变量表示成为一条线程独占的状态。

    2.unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,解锁后才能被其他线程锁定。

    3.read(读取):作用于主内存的变量,它把主内存的变量值传输到线程对应的工作内存中,等待load

    4.load(载入):作用于工作内存的变量, 它把从read操作从主内存中得到的变量值,放入到工作内存的变量副本中。

    5.use(使用):作用于工作内存的变量,它把工作内存的变量的值传递给执行引擎,每当虚拟机遇到一个需要使用的变量的值的字节码指令时,将会执行这个操作。

    6.assigin(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。

    7.store(存储):作用于工作内存的变量,它把工作内存中的一个变量的值传送到主内存中,以便write操作

    8.write(写入):作用于主内存的变量,它把store 操作从工作内存中得到的变量值放到主内存变量中。

 

 

    上诉概念可能都点麻烦,我给个栗子:快过年了,我家买了很多肉,准备做腊肉香肠,现在放冰箱(主内存),如果只能在一个地方(lock)腌制,首先从冰箱取出来(read),然后拿到后院腌制的地方(load工作内存),然后让一个腌制箱腌制(use),腌制好了拿出来,就是腌肉了(assigin).然后拿回去家里(store),最后由放回冰箱存起来,过年吃(write).当然栗子~。~ 仅描述过程,没加入副本的概念,方便理解嘛!

 

五、内存交互限制和顺序

    内存交互中,有一些限制和顺序的,比如从主内存-->工作内存,顺序执行read-->load操作、如果是变量从工作内存同步回主内存,顺序执行store-->write 操作。

    注意:JAVA 内存模型只要求上面两个操作顺序执行,但是并不保证连续执行。加入读取主内存变量a,b,那么顺序可能是read a,read b,load b,load a.同时,JAVA 内存模型还规定了其他规则:

    1.不允许read、load 和 store、write操作之一,单独出现。即只要read 了,必须完成load 操作,只要store 必须完成write 操作。

 

    2.不允许一个线程丢弃它最近的assign操作,即变量再工作内存中发生变化后,必须同步到主内存。

    

    3.不允许一个线程无原因的(无sssign操作)把工作内存中数据同步到主内存。

    

    4.一个新的变量只能在主内存中诞生,不允许工作内存中直接使用一个未被初始化(load/assign) 的变量,也就是说对一个变量实施use、store操作之前,必须先执行过了assign和load操作。

 

    5.一个变量同一时刻只允许一条线程对其lock操作,但是lock操作可以被同一个线程执行多次,同时解锁的时候也要执行相同的unlock操作。

    

    6.如果对一个变量执行lock操作,那将会清空工作内存中的此变量的值,在执行引擎使用这个变量钱,需要从新执行load 或 assign 操作初始化变量值。

 

    7.如果A线程lock住a变量,只能由A线程unlock,未lock的变量,不能unlock。而且A线程不能unlock B线程lock住的变量。

 

    8.在一个变量执行unlock之前,必须先把此变量同不回主内存中(store-->write)

 

 

小结:

    1.关于JAVA 内存模型规范,我没有仔细研究,仅仅参考一些书籍。

    2.关于内存模型的知识,理论比较重,章节就少分享点,希望大家在空闲时间了解,加深影响,对编程细节很有帮助。

    3.学习JAVA 内存模型,可以做一些实际的例子,或者自己有自己的想法,加深记忆理解,不然容易忘记了,写代码的时候多考虑一些这方面的东西。

    4.有什么不好的地方,欢迎提出建议,我再改进~。~

    

 

    

 

 

  • 大小: 13.1 KB
分享到:
评论

相关推荐

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

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

    Java面试-讲一讲什么是Java内存模型

    讲一讲什么是Java内存模型 Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕...说明Java内存模型概念和核心内容 针对重排序说一说重排序的例子,重排序的好处 着重说一说可见性,说一说JVM内存的抽象、hanpens

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    Java并发编程:ThreadLocal、Java内存模型、锁、并发工具类、线程池等;JVM(Java虚拟机):Java内存管理详解、垃圾回收机制、垃圾回收器等;MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用...

    涵盖了 Java 基础、集合、源码、并发、虚拟机、框架、数据库、网络编程、设计模式、新特性和数据结构等多个知识领域的面试突击

    深入理解JVM内存模型、垃圾收集等底层知识 熟悉主流框架的设计思想和运行原理 掌握数据库、缓存、分布式系统等企业级开发技能 拓展视野,了解大数据、人工智能等前沿领域 综上所述,这本Java面试书籍旨在为广大Java...

    JAVA基础课程讲义

    第一章 JAVA入门 10 计算机语言发展史 10 机器语言 10 汇编语言 10 高级语言 10 其他高级语言 11 JAVA发展简史 12 JAVA为什么能够流行? 13 JAVA各版本的含义 13 JAVA技术体系架构 14 JAVA的特性和优势 14 JAVA应用...

    达内java培训目录

    JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...

    疯狂JAVA讲义

    11.5.1 Java事件模型的流程 403 11.5.2 事件和事件监听器 405 11.5.3 事件适配器 409 11.5.4 事件监听器的实现形式 411 11.6 AWT的菜单 413 11.6.1 菜单条、菜单和菜单项 414 11.6.2 右键菜单 416 学生提问:...

    Java语言的科学与艺术 斯坦福大学经典教材

    6.9 编程练习 第7章 对象和内存 7.1 内存结构 7.2 将内存分配给变量 7.3 原始类型与对象 7.4 链接对象 7.5 小结 7.6 复习题 7.7 编程练习 第8章 字符串和字符 8.1 枚举的原则 8.2 字符 8.3 作为抽象概念的字符串 ...

    java多线程设计模式详解(PDF及源码)

    去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的...

    Java语言的科学与艺术(国外计算机科学经典教材)

    但Java语言很复杂,老师和学生们在理解Java语言的结构时,复杂性成为了最大的障碍。  在本书中,斯坦福大学教授、著名的计算机科学教育领导者Eric S.Roberts着重强调了更适合于初学者的友好讲解方式,使用ACM Java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

    Java程序设计案例教程-第8章-多线程编程.pptx

    通过本章的学习,读者应该理解线程和进程的区别,掌握Java的多线程编程技术,了解线程的同步和线程间通信等内容。 第2页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第2页。 本章的学习目标 了解进程...

    Java 或大数据开发者找工作必备材料

    计算机网络是实现数据交换和资源共享的技术基础,关键在于理解网络协议、系统架构和网络安全等概念,以确保信息流动的高效与安全。 操作系统作为计算机系统的核心,负责管理和协调硬件资源与应用软件,其知识包括...

    io:java io学习项目

    Unix Domain Socket熟悉Linux下命令行工具深入理解进程,线程了解Java内存模型了解Java的并发包,如锁,读写锁,Barrier,Executer和Future了解Java 8的Lambda表达式和Streaming API理解TCP/IP协议族理解HTTP协议和...

    ArchKnowledgeTree:架构师知识谱系梳理,包含Java core, JUC, JVM, MySQL,MQ, redis,分布式相关等各种知识点整理。是我按个人理解学习、整理出的一个知识库

    : Netty内存模型 源码分析 Java Core / J.U.C 源码分析之双亲委托模型以及如何破坏双亲委托 源码分析之JDBC实现原理与SPI机制 tomcat和dubbo对于JDK线程池的修改 源码分析之Java线程池ThreadPoolExecutor 常见...

    Java 虚拟机面试题全面解析(干货)

    什么是Java内存模型? Java内存模型的目标? 主内存与工作内存 内存间的交互操作 原子性、可见性、有序性 volatile 什么是 volatile? 为什么基于 volatile变量的运算在并发下不一定是安全的? 为什么使用 volatile? ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

Global site tag (gtag.js) - Google Analytics