JMM

JMM (Java Memory Model "Java 内存结构"). 简单来说, JMM 定义了一套在多线程读写共享数据时, 对数据的 可见性, 有序性 和原子性 的规则与保障.

1. 原子性
  • 含义: 指一个操作是不可中断的. 在多线程环境下, 一个操作一旦开始, 就不会被其他线程干扰, 要么全部执行成功, 要么全部不执行.

  • 保证方式: 使用 Synchronized 关键字. Synchronized 可以保证同一时刻只有一个线程进入被其修饰的代码块, 从而使得代码块中的操作具有原子性.

2. 可见性
  • 含义: 指当一个线程修改了共享变量的值, 其他线程能够立即得知这个修改. 在多线程环境下, 每个线程可能有自己的工作内存, 对共享变量的操作可能先在工作内存中进行修改, 然后才会刷新到主内存. 这就可能导致其他线程无法及时看到变量的最新值.

  • 保证方式: 使用 volatile 关键字. 被 volatile 修饰的变量, 在每次被线程访问时, 都会从主内存中读取最新值 ; 在每次修改后, 都会立即刷新到主内存中, 从而保证了不同线程之间变量的可见性.

3. 有序性
  • 含义: 指程序执行的顺序按照代码的先后顺序执行. 在 Java 中, 为了提高系统性能, 编译器和处理器可能会对指令进行重排序. 重排序后程序的执行结果在单线程环境下不变, 但是这在多线程环境下可能会导致问题.

  • 保证方式:

    1. 使用 volatile 关键字. volatile 除了保证可见性, 还能禁止指令重排序 (阻止编译器和处理器对 与 volatile 变量相关的指令进行重排序, 从而保证了有序性).

    2. 使用 java.util.concurrent.atomic 包下的原子类. 这些原子类的操作基于硬件级别的原子指令, 本身具有有序性.

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐