返回
重新定义 Java 内存模型基础,剖析内存底层原理
后端
2023-10-04 00:54:44
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 程序。