返回

重新定义 Java 内存模型基础,剖析内存底层原理

后端

Java 内存模型 (JMM) 是 Java 编程语言的核心概念之一,它屏蔽了不同硬件和操作系统的内存访问差异,确保了 Java 程序在各种平台上都能获得一致的行为。本文将深入探讨 Java 内存模型的基础概念,为读者提供对 Java 内存模型的全面理解。

工作内存和主内存

Java 内存模型将内存分为两个主要部分:工作内存和主内存。工作内存是每个线程私有的,它包含了该线程正在执行的变量的副本。主内存是所有线程共享的,它包含了程序的所有变量的唯一副本。

当一个线程访问一个变量时,它首先会从工作内存中获取该变量的值。如果该变量的值不在工作内存中,则该线程会从主内存中获取该变量的值并将其放入工作内存中。当一个线程修改一个变量时,它只修改工作内存中的变量副本。要使修改后的值对其他线程可见,该线程必须将修改后的值写回主内存。

可见性

可见性是指一个线程对变量的修改能够被其他线程看到。JMM 通过两种机制来确保可见性:

  • 内存屏障 (Memory Barrier) :内存屏障是一种特殊的指令,它可以阻止指令重排序,并确保对变量的修改按程序顺序发生。
  • **volatile ** :volatile 关键字可以将变量标记为易失性变量,易失性变量的修改会立即写回主内存,并使其他线程能够立即看到修改后的值。

原子性

原子性是指一个操作要么完全执行,要么完全不执行。JMM 通过两种机制来确保原子性:

  • 硬件支持的原子操作 :某些硬件架构提供了原子操作指令,这些指令可以确保操作是原子的。
  • 锁 (Lock) :锁可以防止多个线程同时访问同一个变量,从而确保对变量的修改是原子的。

有序性

有序性是指对变量的修改按程序顺序发生。JMM 通过两种机制来确保有序性:

  • 程序顺序规则 :程序顺序规则规定了语句的执行顺序,并确保对变量的修改按程序顺序发生。
  • happens-before 规则 :happens-before 规则定义了哪些操作在程序中先行发生,并确保先行发生的操作对后继操作可见。

一致性

一致性是指所有线程对变量的访问都返回相同的值。JMM 通过一种机制来确保一致性:

  • 写屏障 (Write Barrier) :写屏障是一种特殊的指令,它可以防止指令重排序,并确保对变量的修改按程序顺序写回主内存。

volatile 和 synchronized 关键字

volatile 和 synchronized 关键字是 Java 中用来控制内存可见性、原子性和有序性的两个关键字。

  • volatile 关键字 :volatile 关键字可以将变量标记为易失性变量,易失性变量的修改会立即写回主内存,并使其他线程能够立即看到修改后的值。
  • synchronized 关键字 :synchronized 关键字可以将方法或代码块标记为同步方法或同步代码块,同步方法或同步代码块在执行时会自动获取锁,从而防止多个线程同时访问同一个变量。

结束语

Java 内存模型是一个复杂且重要的概念,它对 Java 程序的正确性和性能至关重要。通过对 Java 内存模型的基础概念的深入理解,读者可以编写出更加健壮和高效的 Java 程序。