java面试一日一题:java内存模型
问题:请讲下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内存模型的更多相关文章
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
- java面试一日一题:讲下在什么情况下会发生类加载
问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...
- java面试一日一题:java中垃圾回收算法有哪些
问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...
- java面试一日一题:mysql中常用的存储引擎有哪些?
问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...
- java面试一日一题:讲下mysql中的undolog
问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...
- java面试一日一题:java线程池
问题:请讲下java中的线程池 分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少 回答要点: 主要从以下几点去考虑, 1.为什么要使用 ...
- java面试一日一题:如何判断一个对象是否为垃圾对象
问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...
- java面试一日一题:java的类加载过程
问题:请讲下java的类加载机制及过程 分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗: 回答要点: 主要从以下几点去考虑, 1.类 ...
- java面试一日一题:java中一个对象实例的结构是什么样子的
问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的 分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的 回答要点: 主要从以下几点去考虑, ...
- java面试一日一题:讲对mysql的MVCC的理解
问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...
随机推荐
- Django——form组件的局部钩子
如果对字段的校验条件太少,不能满足我们的需求,那么,我们可以对每个字段自定义校验的内容,就可以使用局部钩子. 局部钩子的使用方法: (1)导入错误类型 ----> 我们自己定义的钩子抛出的错误也 ...
- EndNote里参考文献的期刊名显示错误怎么办?
本文介绍EndNote文献管理软件导入文献引用时,期刊名称带有%J前缀从而不能正常显示的解决方法. 前期的文章中,我们多次介绍了文献管理软件EndNote的具体使用方法与技巧.而在使用EndN ...
- nginx map模块使用和配置
主机 IP 备注 master1 10.0.0.63 master2 10.0.0.64 1. NGINX MAP模块与NGINX GEO模块 在通常情况下,使用nginx基于 ip 限制访问请求频率 ...
- mysql笔记第一天: 介绍和MySQL编译安装
一.DBA的工作内容:  ...
- css 跑马灯
html: <view class="in_scro"> <view class="in_scrview">恭喜139******1用户 ...
- js随机数 比较运算符
// 生成一个随机数 1 - 100 范围内的随机数 // 大家先记住 JavaScript 生成随机数值的 公式 // 如果要 生成 a - b 范围内的数值 ...
- Spring扩展——BeanPostProcessor(BPP)
BeanPostProcess简介 在Spring中 BeanPostProcessor 是一个非常重要的接口,它用于在每个bean对象初始化前后修改Bean的属性信息,比如我们最常用的@Autowi ...
- 第四届物联网与机器学习国际学术会议(IoTML 2024)
[ACM独立出版,高录用,见刊检索快速稳定]第四届物联网与机器学习国际学术会议(IoTML 2024) [IoTML 2023会后三个半月内完成EI检索]2024 4th International ...
- idea如何快速找到项目中待处理的TODO注释
idea如何快速找到项目中待处理的TODO注释 idea菜单栏 View -> Tool Windows,可以打开TODO窗口
- Unity网络通信系统设计
Unity网络通信系统设计 Buffer报文 BufferEntity类作为报文基类的作用包括: 封装数据:BufferEntity类可以用来封装网络通信中的数据,方便在网络传输中进行处理和管理. 提 ...