Java虚拟机的内存模型(Java Memory Model,简称JMM)定义了多线程程序中各个线程之间如何访问共享内存的规则,以及在何时以及如何同步对共享变量的访问。JMM主要关注以下几个方面:

1. 主内存和工作内存:

  • 主内存(Main Memory): 所有线程共享的内存区域,包含所有的共享变量。
  • 工作内存(Working Memory): 每个线程私有的内存区域,存储了该线程使用到的变量的副本。

2. 内存屏障(Memory Barriers):

  • 读屏障(Read Barrier): 用于确保一个线程读取一个共享变量的值时,能够看到其他线程对该变量在主内存中的最新写入。
  • 写屏障(Write Barrier): 用于确保一个线程写入一个共享变量的值时,对其他线程能够立即可见。

3. 原子性、可见性、有序性:

  • 原子性(Atomicity): 指的是一个操作是不可中断的。要么这个操作全部执行成功,要么全部不执行。
  • 可见性(Visibility): 指的是当一个线程修改了共享变量的值,其他线程能够立即看到这个修改。
  • 有序性(Ordering): 指的是程序执行的顺序按照代码的先后顺序来执行。

4. Happens-Before规则:

  • 程序次序规则(Program Order Rule): 在一个线程内,按照程序代码的顺序,前面的操作 Happens-Before 于后面的操作。
  • 监视器锁规则(Monitor Lock Rule): 对一个锁的解锁 Happens-Before 于随后对这个锁的加锁。
  • volatile变量规则(Volatile Variable Rule): 对一个 volatile 字段的写操作 Happens-Before 于任意后续对这个 volatile 字段的读操作。
  • 线程启动规则(Thread Start Rule): 线程 A 启动线程 B,那么线程 B 的操作 Happens-Before 于线程 A 的后续操作。
  • 线程终止规则(Thread Termination Rule): 线程 A 等待线程 B 终止,那么线程 B 的终止操作 Happens-Before 于线程 A 的后续操作。

5. final域规则:

  • final域规则(Final Field Rule): 在构造函数内对一个 final 域的写操作,与随后在构造函数外(包括其他线程中)对这个 final 域的读操作,保证能看到构造函数内对 final 域的写入。

JMM通过上述规则来保证多线程程序中的内存访问操作的正确性。了解JMM对于写出正确、高效的多线程程序非常重要。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.