返回

第二章JMM:揭秘Java内存模型,你真的了解吗?

见解分享

第二章JMM

计算机内存模型

在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型。冯·诺依曼,提出计算机由五大组成部分,输入设备,输出设备存储器,控制器,运算器。中央处理器,是计算机的控制和运算的核心,我们的程序最终都会变成指令让CPU去执行,处理程序中的数据。我们的程序都是在内存中运行的,所以,内存的数据,需要经过CPU才能供程序使用。这就涉及到两个问题。

  1. CPU如何访问内存?
  2. CPU如何保证这些内存数据的正确性?

内存,在物理上其实都是0和1组成的,数据的处理和计算也需要转换成0和1这种机器语言才能被CPU所理解。内存是所有程序和数据最终的归宿。程序和数据都在内存中执行和存放。为了对内存的数据进行读取和存储,CPU使用了一种叫作总线的技术。

内存模型

内存模型,是对计算机的内存子系统进行抽象,提供了一个简化的视图。内存模型定义了内存如何被访问、以及如何保证数据的正确性。

冯·诺依曼模型

冯·诺依曼模型,是计算机内存模型中最简单的一种。该模型假设内存是一个线性地址空间,由连续的内存单元组成。每个内存单元都存储一个数据值,CPU可以按地址访问这些内存单元。

哈佛模型

哈佛模型,是另一种计算机内存模型。该模型假设内存分为两个独立的部分:指令内存和数据内存。指令内存存储指令,而数据内存存储数据。CPU可以分别访问指令内存和数据内存。

缓存一致性模型

缓存一致性模型,是一种更复杂的计算机内存模型。该模型假设内存被划分为多个缓存,每个缓存都存储一份内存数据的副本。CPU可以从缓存中访问数据,而当缓存中的数据副本与内存中的数据副本不一致时,缓存一致性模型会负责更新缓存中的数据副本。

Java内存模型

Java内存模型(JMM)是Java虚拟机(JVM)用于管理内存和线程的规范。JMM定义了Java程序在多线程环境中的行为,并保证了不同线程对共享数据的访问是安全的。

JMM的核心概念

JMM的核心概念包括:

  • 内存可见性: 内存可见性是指一个线程对共享数据的修改对其他线程是可见的。
  • 原子性: 原子性是指一个操作要么完全执行,要么根本不执行。
  • 指令重排: 指令重排是指编译器或CPU可以改变指令的执行顺序,只要不改变程序的最终结果。
  • happens-before关系: happens-before关系是一种偏序关系,它定义了程序中哪些操作必须在其他操作之前执行。

JMM的应用

JMM在实际编程中有很多应用,例如:

  • 同步: 同步机制可以确保对共享数据的访问是安全的。
  • volatile变量: volatile变量可以保证对共享数据的修改对其他线程是可见的。
  • final变量: final变量可以保证在程序中不会被修改。
  • 原子操作: 原子操作可以保证一个操作要么完全执行,要么根本不执行。

结语

Java内存模型(JMM)是Java虚拟机(JVM)用于管理内存和线程的规范。JMM定义了Java程序在多线程环境中的行为,并保证了不同线程对共享数据的访问是安全的。通过理解JMM的核心概念,我们可以更好地理解Java程序的行为,并编写出更可靠的程序。