一、Java 内存模型

java内存模型把 Java 虚拟机内部划分为线程栈和堆

下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上。

     ==》》 

一个局部变量可能是原始类型,在这种情况下,它总是“呆在”线程上。

一个局部变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上

一个对象可能包含方法,这些方法可能包含局部变量。这些本地变量任然存放在线程栈上,即使这些方法所属的对象存放在堆上。

一个对象的成员变量可能随着这个对象自身存放在上。不管这个成员变量是原始类型还是引用类型。

静态成员变量跟随着类定义一起也存放在上。

存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量(共享),但是每一个线程都拥有这个方法内局部变量的私有拷贝。

二、计算机硬件内存模型

三、java内存模型与硬件内存架构之间桥接

Java 内存模型与硬件内存架构之间存在差异。硬件内存架构没有区分线程栈和堆。对于硬件,所有的线程栈和堆都分布在主内中。部分线程栈和堆可能有时候会出现在 CPU 缓存中和 CPU 内部的寄存器中。

当对象和变量被存放在计算机中各种不同的内存区域中时,就可能会出现一些具体的问题。主要包括如下两个方面:

  • 线程对共享变量修改的可见性                                =》共享变量加上volatile 关键字
  • 当读,写和检查共享变量时出现 race conditions       =》同步解决,同步块还可以保证代码块中所有被访问的变量将会从主存中读入,当线程退出同步代码块时,所有被更新的变量都会被刷新回主存中去,不管这个变量是否被声明为 volatile。

转载于:https://www.cnblogs.com/lwcoding/p/6656589.html

java 内存模型 ——学习笔记相关推荐

  1. java内存模型---学习笔记

    主内存和工作内存 Java内存模型规定了所有的变量都存储在主内存中,每条线程有自己的工作内存. 线程.主内存.工作内存三者的交互关系: 内存间交互操作: lock(锁定):作用于主内存的变量,把一个变 ...

  2. 解释 i = i++为什么等于本身的问题——JVM内存模型学习笔记

    前段时间在扫题的时遇到类似以下的例子: public class Test {public static void main(String [] args) {int i = 1 ;//int j = ...

  3. 深入Java虚拟机-第二章-Java内存区域-学习笔记

    Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...

  4. 马士兵 java内存_学习笔记-马士兵java-JAVA的面向对象与内存解析

    1. 类的定义:成员变量.方法 ① 声明成员变量格式:[] type [=defaultValue]; (例:private int id;) ② 声明方法格式:[]([argu_list]){ [] ...

  5. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  6. 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]

    文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...

  7. 《深入理解 Java 内存模型》读书笔记(上)(干货,万字长文)

    目录 0. 前提 1. 基础 1.1 并发编程的模型分类 1.1.1 通信 1.1.2 同步 1.2 JAVA 内存模型的抽象 2. 重排序 2.1 处理器重排序 2.2 内存屏障指令 2.3 HAP ...

  8. JVM学习-Java内存模型JMM

    目录 1.Java内存模型概述 2.原子性 2.1.问题提出 2.2.问题分析 2.3.解决办法 3.原子性 3.1.退不出的循环 3.2 解决方法 3.3 可见性 4.有序性 4.1.诡异的结果 4 ...

  9. Java内存模型(JMM)学习总结

    首先介绍两个名词:1)可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到.2)共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java线程之间的 ...

最新文章

  1. C/MFC如何获得应用程序当前路径(整理)
  2. http://www.openwebx.org/docs/turbine.html
  3. poj1061-青蛙的约会
  4. 《系统集成项目管理工程师》必背100个知识点-41控制进度
  5. Linux--根文件系统的挂载过程分析
  6. 解决 IDEA 在 commit 代码时 git 日志乱码 (提交时填写的中文说明乱码)
  7. Squid服务日志分析
  8. android.hardware.Camera类及其标准接口介绍
  9. DTLS协议中的509证书和密钥如何传输
  10. C语言内存动态分配与释放
  11. 2021普通高考重庆成绩查询平台,2021年重庆高考成绩查询时间及查分方式
  12. VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)
  13. 常用公共数据集----数据获取
  14. 原型图工具功能比拼1
  15. 使用Python实现一个简单的聊天室
  16. 机器学习实战(七):Ensemble Learning and Random Forests
  17. 客服如何提高工作效率
  18. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
  19. 我是如何拿到小米、京东、字节等大厂前端offer的
  20. 短信业务管理-移动短信接入

热门文章

  1. Boost:bind绑定右值的测试程序
  2. 基于Boost::beast模块的协程WebSocket客户端
  3. C++如何使用puff()的示例
  4. ITK:将两个图像相乘
  5. Qt将应用程序部署到Android设备
  6. C++设计模试之S状态模式
  7. ubuntu 18 mysql5.7_Ubuntu18.04 下 MySQL5.7 的安装
  8. jquery 根据class名 赋值_jQuery简单用法!!!
  9. 03_Android项目中读写文本文件的代码
  10. 游戏外挂技术:编程实现内存检索(检索内存中指定数据)