java 内存模型 ——学习笔记
一、Java 内存模型
java内存模型把 Java 虚拟机内部划分为线程栈和堆
下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上。
==》》
一个局部变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上。
一个局部变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。
一个对象可能包含方法,这些方法可能包含局部变量。这些本地变量任然存放在线程栈上,即使这些方法所属的对象存放在堆上。
一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。
静态成员变量跟随着类定义一起也存放在堆上。
存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量(共享),但是每一个线程都拥有这个方法内局部变量的私有拷贝。
二、计算机硬件内存模型
三、java内存模型与硬件内存架构之间桥接
Java 内存模型与硬件内存架构之间存在差异。硬件内存架构没有区分线程栈和堆。对于硬件,所有的线程栈和堆都分布在主内中。部分线程栈和堆可能有时候会出现在 CPU 缓存中和 CPU 内部的寄存器中。
当对象和变量被存放在计算机中各种不同的内存区域中时,就可能会出现一些具体的问题。主要包括如下两个方面:
- 线程对共享变量修改的可见性 =》共享变量加上volatile 关键字
- 当读,写和检查共享变量时出现 race conditions =》同步解决,同步块还可以保证代码块中所有被访问的变量将会从主存中读入,当线程退出同步代码块时,所有被更新的变量都会被刷新回主存中去,不管这个变量是否被声明为 volatile。
转载于:https://www.cnblogs.com/lwcoding/p/6656589.html
java 内存模型 ——学习笔记相关推荐
- java内存模型---学习笔记
主内存和工作内存 Java内存模型规定了所有的变量都存储在主内存中,每条线程有自己的工作内存. 线程.主内存.工作内存三者的交互关系: 内存间交互操作: lock(锁定):作用于主内存的变量,把一个变 ...
- 解释 i = i++为什么等于本身的问题——JVM内存模型学习笔记
前段时间在扫题的时遇到类似以下的例子: public class Test {public static void main(String [] args) {int i = 1 ;//int j = ...
- 深入Java虚拟机-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- 马士兵 java内存_学习笔记-马士兵java-JAVA的面向对象与内存解析
1. 类的定义:成员变量.方法 ① 声明成员变量格式:[] type [=defaultValue]; (例:private int id;) ② 声明方法格式:[]([argu_list]){ [] ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
- 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]
文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...
- 《深入理解 Java 内存模型》读书笔记(上)(干货,万字长文)
目录 0. 前提 1. 基础 1.1 并发编程的模型分类 1.1.1 通信 1.1.2 同步 1.2 JAVA 内存模型的抽象 2. 重排序 2.1 处理器重排序 2.2 内存屏障指令 2.3 HAP ...
- JVM学习-Java内存模型JMM
目录 1.Java内存模型概述 2.原子性 2.1.问题提出 2.2.问题分析 2.3.解决办法 3.原子性 3.1.退不出的循环 3.2 解决方法 3.3 可见性 4.有序性 4.1.诡异的结果 4 ...
- Java内存模型(JMM)学习总结
首先介绍两个名词:1)可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到.2)共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java线程之间的 ...
最新文章
- C/MFC如何获得应用程序当前路径(整理)
- http://www.openwebx.org/docs/turbine.html
- poj1061-青蛙的约会
- 《系统集成项目管理工程师》必背100个知识点-41控制进度
- Linux--根文件系统的挂载过程分析
- 解决 IDEA 在 commit 代码时 git 日志乱码 (提交时填写的中文说明乱码)
- Squid服务日志分析
- android.hardware.Camera类及其标准接口介绍
- DTLS协议中的509证书和密钥如何传输
- C语言内存动态分配与释放
- 2021普通高考重庆成绩查询平台,2021年重庆高考成绩查询时间及查分方式
- VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)
- 常用公共数据集----数据获取
- 原型图工具功能比拼1
- 使用Python实现一个简单的聊天室
- 机器学习实战(七):Ensemble Learning and Random Forests
- 客服如何提高工作效率
- Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
- 我是如何拿到小米、京东、字节等大厂前端offer的
- 短信业务管理-移动短信接入
热门文章
- Boost:bind绑定右值的测试程序
- 基于Boost::beast模块的协程WebSocket客户端
- C++如何使用puff()的示例
- ITK:将两个图像相乘
- Qt将应用程序部署到Android设备
- C++设计模试之S状态模式
- ubuntu 18 mysql5.7_Ubuntu18.04 下 MySQL5.7 的安装
- jquery 根据class名 赋值_jQuery简单用法!!!
- 03_Android项目中读写文本文件的代码
- 游戏外挂技术:编程实现内存检索(检索内存中指定数据)