Java|面试官问我什么是JMM


Java|面试官问我什么是JMM
文章图片
Java|面试官问我什么是JMM
文章图片
Java|面试官问我什么是JMM
文章图片
Java|面试官问我什么是JMM
文章图片

简介:一篇文章搞懂java内存模型、JMM三大特征、volatile关键字
思维导图


面试官:讲讲什么是JMM
你要是整这个我可就不困了 。


JMM就是Java内存模型(java memory model) 。 因为在不同的硬件生产商和不同的操作系统下 , 内存的访问有一定的差异 , 所以会造成相同的代码运行在不同的系统上会出现各种问题 。 所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异 , 以实现让java程序在各种平台下都能达到一致的并发效果 。
Java内存模型规定所有的变量都存储在主内存中 , 包括实例变量 , 静态变量 , 但是不包括局部变量和方法参数 。 每个线程都有自己的工作内存 , 线程的工作内存保存了该线程用到的变量和主内存的副本拷贝 , 线程对变量的操作都在工作内存中进行 。 线程不能直接读写主内存中的变量 。
不同的线程之间也无法访问对方工作内存中的变量 。 线程之间变量值的传递均需要通过主内存来完成 。
如果听起来抽象的话 , 我可以画张图给你看看 , 会直观一点:


每个线程的工作内存都是独立的 , 线程操作数据只能在工作内存中进行 , 然后刷回到主存 。 这是 Java 内存模型定义的线程基本工作方式 。
温馨提醒一下 , 这里有些人会把Java内存模型误解为Java内存结构 , 然后答到堆 , 栈 , GC垃圾回收 , 最后和面试官想问的问题相差甚远 。 实际上一般问到Java内存模型都是想问多线程 , Java并发相关的问题 。
面试官:那JMM定义了什么
这个简单 , 整个Java内存模型实际上是围绕着三个特征建立起来的 。 分别是:原子性 , 可见性 , 有序性 。 这三个特征可谓是整个Java并发的基础 。
原子性
原子性指的是一个操作是不可分割 , 不可中断的 , 一个线程在执行时不会被其他线程干扰 。
面试官拿笔写了段代码 , 下面这几句代码能保证原子性吗?
int i = 2;
int j = i;
i++;
i = i + 1;

第一句是基本类型赋值操作 , 必定是原子性操作 。
第二句先读取i的值 , 再赋值到j , 两步操作 , 不能保证原子性 。
第三和第四句其实是等效的 , 先读取i的值 , 再+1 , 最后赋值到i , 三步操作了 , 不能保证原子性 。
JMM只能保证基本的原子性 , 如果要保证一个代码块的原子性 , 提供了monitorenter 和 moniterexit 两个字节码指令 , 也就是 synchronized 关键字 。 因此在 synchronized 块之间的操作都是原子性的 。


推荐阅读