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