java常见面试考点
往期文章推荐:
java常见面试考点(十六):类加载器的常见考点
深入浅出JVM系列(一):JVM内存结构
深入浅出JVM系列(二):垃圾收集算法
深入浅出JVM系列(三):JVM生命周期
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权);
本博客的内容来自于:深入浅出JVM系列(四):Java内存模型(JMM);
学习、合作与交流联系q384660495;
本博客的内容仅供学习与参考,并非营利;
一、前言
首先。Java内存区域(运行时数据区域)和内存模型(JMM)是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。
而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。
JMM本身是一种抽象的概念并不存在,它描述的是一种规范或规则,通过这组规范定义了程序各个变量的访问方式。
JMM中关于同步的规定:
- 线程解锁前,必须把共享变量的值刷新回主内存;
- 线程加锁前,必须读取主内存的最新值到自己的工作内存;
- 加锁解锁是同一把锁;
二、计算机高速缓存和缓存一致性
计算机在高速的 CPU 和相对低速的存储设备之间使用高速缓存,作为内存和处理器之间的缓冲。将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。
在多处理器的系统中(或者单处理器多核的系统),每个处理器内核都有自己的高速缓存,它们有共享同一主内存(Main Memory)。
当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。
为此,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议进行操作,来维护缓存的一致性。
三、JVM主内存与工作内存
Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量(线程共享的变量)存储到内存和从内存中取出变量这样底层细节。
Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。
这里的工作内存是 JMM 的一个抽象概念,也叫本地内存,其存储了该线程以读 / 写共享变量的副本。
就像每个处理器内核拥有私有的高速缓存,JMM 中每个线程拥有私有的本地内存。
不同线程之间无法直接访问对方工作内存中的变量,线程间的通信一般有两种方式进行,一是通过消息传递,二是共享内存。Java 线程间的通信采用的是共享内存方式,线程、主内存和工作内存的交互关系如下图所示:
四、JMM三大特性
1、可见性
实验代码如下所示:
/**
* @author xiatao
* @create 2021--05--14 15:01
* @describe
*/
public class Exam {
public static void main(String[] args) {
Data data = new Data();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\tcome in");
try {
TimeUnit