问题:请讲下java内存模型?

分析:该问题比较容易和jvm内存区域(java内存结构)这样的问题混淆,其实他们是两个概念,jvm内存区域指的是运行时的几块数据区域,包括堆、方法区、虚拟机栈、本地方法栈、程序计数器,强调的是在java程序运行的时候,内存是怎么划分的;而内存模型是另外的一个概念。

回答要点:

主要从以下几点去考虑,

1、java内存模型的作用,保证程序执行的可见性、有序性、原子性;

2、内存模型定义了什么,内存模型定义了多线程读写共享内存的规范;

3、内存模型怎么实现多线程共享变量的读写;

java内存模型简称JMM,是一种规范,通过这些规范定义java程序中各个变量的访问方式,解决并发编程中可能出现的线程安全问题。jvm运行程序的实体是线程,每个线程创建时jvm都会为其创建一个工作内存,用于存放线程私有的数据;Java内存模型规定所有的变量均保存在主内存中,主内存是共享内存,所有的线程都可以访问,但对变量的所有操作(包括读取赋值)都在工作内存中进行,线程无法直接操作主内存中的变量,所以就有了JMM。

主内存

主要存储的是Java实例对象,所有线程创建的实例对象都在主内存中,不管是成员变量还是在方法中创建的局部变量,同时也包含类信息、常量(static final)、静态变量(static)。由于主内存是共享区域,所以多个线程对同一个变量访问就会有线程安全问题;可以把主内存想象为java内存区域的堆、方法区

工作内存

主要存储当前线程正在执行的方法的所有本地变量(工作内存中存储着主内存中变量的副本),工作内存只对当前线程可见,其他线程无法访问当前线程的变量;可以把工作内存想象为Java内存区域的虚拟机栈、本地方法栈、程序计数器;是在java程序运行时的内存;

一个实例对象中的成员方法,如果方法中包含本地变量是基本数据类型(8种,boolean byte short int long double float char),这些基本类型的变量存储在工作内存中;如果本地变量是引用类型,那么该变量的引用存储在工作内存中,对象实例则存储在主内存中,对应对象实例中的成员变量不论是基本类型还是引用类型都存储在主内存中;

例,

public class Test{

private void method(){
A ma=new A();
int a=0; } } public class A{
private int a;
private Integer aa; }

上面的方法method中的ma会存储在工作内存中,a存储在工作内存,而new A()生成的实例存储在主内存中,包括实例中的a也是存储在主内存中;

在Java中可以依靠volatile和synchronized关键字来保证可见性、有序性、原子性,除此之外还定义了一套happens-before原则来保证多线程操作时的可见性、有序性、原子性;

程序顺序原则,在一个线程内必须保证语义串行性,也就是按照代码顺序执行;

锁原则,加锁操作必然发生在解锁操作之后(同一把锁);

volatile原则,volatile的写先发生于volatile的读;

。。。

先写下分析思路,后续补充详细内容,有不当之处欢迎指正!

java面试一日一题:java内存模型的更多相关文章

  1. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  2. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  3. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  4. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  5. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  6. java面试一日一题:java线程池

    问题:请讲下java中的线程池 分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少 回答要点: 主要从以下几点去考虑, 1.为什么要使用 ...

  7. java面试一日一题:如何判断一个对象是否为垃圾对象

    问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...

  8. java面试一日一题:java的类加载过程

    问题:请讲下java的类加载机制及过程 分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗: 回答要点: 主要从以下几点去考虑, 1.类 ...

  9. java面试一日一题:java中一个对象实例的结构是什么样子的

    问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的 分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的 回答要点: 主要从以下几点去考虑, ...

  10. java面试一日一题:讲对mysql的MVCC的理解

    问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...

随机推荐

  1. QShop商城-快速开始-前端

    QShop商城-快速开始-前端 工具准备 NodeJs 前端环境为NodeJs,下载地址:http://nodejs.cn/download/current/ . 默认会用版本为Node 16,如找不 ...

  2. Android 13 - Media框架(18)- CodecBase

    关注公众号免费阅读全文,进入音视频开发技术分享群! 从这一节开始我们会回到上层来看ACodec的实现,在这之前我们会先了解ACodec的基类CodecBase.CodecBase.h 中除了声明有自身 ...

  3. WPF 中使用附加属性解决 PasswordBox 的数据绑定问题

    1.前言 在 WPF 开发中 View 中的数据展示我们常通过 Binding 进行绑定.但是,使用 Binding 有一个前提:绑定的目标只能是依赖属性. 而 PasswordBox 控件中的 Pa ...

  4. 智影AI故事转视频创作神器!快速开启AI绘画小说推文之旅

    1.前言 1.1 生成内容形式 生成内容形式主要包含三种,PGC(Professionally Generated Content).UGC(User Generated Content).AIGC( ...

  5. 8.14考试总结(NOIP模拟39)[打地鼠·竞赛图·糖果·树]

    一举一动,都是承诺,会被另一个人看在眼里,记在心上的. T1 打地鼠 解题思路 数据范围比较小,不需要什么优化. 直接二维前缀和枚举右下角端点就好了. code #include<bits/st ...

  6. python-使用百度AipOcr实现表格文字图片识别

    注:本博客中的代码实现来自百度问答:https://jingyan.baidu.com/article/c1a3101ef9131c9e646deb5c.html 代码运行环境:win10  pyth ...

  7. 使用Jsoup和htmlunit爬取动态网页

    在对http://zkgg.tjtalents.com.cn/newzxxx.jsp这个网页爬取内容时,如果只使用Jsoup进行解析的话,起内部的a href标签内容无法获取到. 但是实际上通过 Do ...

  8. kettle从入门到精通 第十二课 kettle java代码过滤记录、利用Janino计算Java表达式

    1.下图通过简单的示例讲解了根据java代码过滤记录和利用Janino计算Java表达式两个组件. 2.根据java代码过滤记录 1)步骤名称:自定义 2)接收匹配的行的步骤(可选):下面条件(jav ...

  9. java线程常见的几种方法

    线程常见的几种方法 标签(空格分隔): 多线程 Thread静态方法 1. Thread.sleep(misseconeds) 睡眠:当前线程暂停一段时间让给别的线程去运行.Sleep复活时间,根据你 ...

  10. 从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“

    本文为从零开始写 Docker 系列第十八篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...