什么是内存模型?
Java内存模型(Java Memory Model)描述了Java编程语言中的线程如何与内存进行交互,是和多线程相关的一组规范,需要各个 JVM 的实现来遵守 JMM 规范,以便于开发者可以利用这些规范,更方便地开发多线程程序。有了这些规范,即便同一个程序在不同操作系统的虚拟机上运行,得到的程序结果也是一致的。如果没有这些规范,不同操作系统的虚拟机对相同关键字的解释不一致,这是不可接受的。JMM旨在解决 CPU 多级缓存、处理器优化、指令重排等导致的结果不可预期的问题。
特别注意一点,Java内存模型是与多线程并发相关的规范,不是JVM内存结构。JVM内存结构讲的是JVM如何划分运行时内存区域,比如虚拟机规范将内存区域划分为堆区、方法区、虚拟机栈、本地方法栈、程序计数器五个区域。不同虚拟机可能在实现上会略有不同,但总体是按规范实现的。比如Hotspot虚拟机栈和本地方法栈是合并实现的,JDK8方法区用元空间来实现,但JDK7以下则可能是永久代来实现。
内存模型是同步关键字原理
在Java程序中,volatile、synchronized、Lock等同步关键字或锁工具类其实现原理都涉及JMM规范,或说它们就是遵循JMM规范来实现的。
比如说,我们使用volatile来修饰一个共享变量,那么这个变量在多线程环境下,数据变更会立刻从工作内存刷新回主内存以确保变量的可见性。同时,被volatile来修饰的变量也会禁止指令重排序。synchronized也有同样的效果,保证可见性,禁止指令重排序,同时会变量添加monitor对象锁,多个线程访问被synchronized修饰的变量只能等其它线程释放锁才能访问此变量。因此,synchronized能保证变量的线程安全,相当于将变量的读写串行化了,因此能保证变量的线程安全。
JMM最重要的三个东西上面基本都已提及,即原子性、可见性与指令重排序。下面我们详细了解下这几方面的内容。
什么是原子性?
在介绍Java线程的文章中也有提及,这里再次拿出来讲述一下。具备原子性的操作被称为原子操作,原子操作可以认为是一个或一组不可分割的操作,操作要么做完了,要么就都不做,不存在只做一半的情况,原子性意味着不可分割。编程界经典操作,i++,这句代码看似只有一句代码,好像很原子了,实际则不然。下面例子你觉得会打印1还是0?
public class AddTest3 {
private static int i
标签:Java,变量,虚拟机,读懂,线程,内存,多线程
From: https://blog.csdn.net/u012882823/article/details/139865255