JMM(Java 内存模型)是 Java 平台定义的一种内存模型,它规定了 Java 程序中多线程并发访问共享内存的行为和规则。JMM 定义了线程如何与主内存和线程本地内存交互,以及如何通过同步机制来保证线程安全和可见性。
JMM 主要关注以下几个方面:
-
主内存(Main Memory):主内存是所有线程共享的内存区域,包含了所有的共享变量。所有的变量都存储在主内存中,线程之间可以通过读写共享变量来进行通信。
-
线程本地内存(Thread Local Memory):每个线程都有自己的线程本地内存,它包含了该线程使用到的变量的副本。线程在执行过程中,会把主内存中的共享变量拷贝到线程本地内存中进行操作,操作完成后再将结果刷新回主内存。
-
内存间的交互:JMM 定义了线程与主内存之间的交互规则。当一个线程对共享变量进行读操作时,必须先从主内存中获取最新的值;当一个线程对共享变量进行写操作时,必须将修改后的值刷新回主内存。这样可以保证不同线程之间对共享变量的操作是可见的。
-
原子性、可见性和有序性:JMM 定义了对共享变量的操作具备原子性、可见性和有序性。原子性指一个操作是不可中断的,要么全部执行成功,要么完全不执行;可见性指一个线程对共享变量的修改对其他线程是可见的;有序性指程序的执行结果与程序中的顺序一致。
JMM 通过使用同步机制(如 synchronized
、volatile
、Lock
等)来保证线程之间的协调和同步,以及对共享变量的一致性访问。通过遵循 JMM 的规则,可以编写正确、高效且线程安全的多线程程序。
需要注意的是,JMM 只规定了程序中多线程访问共享内存的行为和规则,而不关注底层的硬件和操作系统的实现。具体的 JVM 实现会根据 JMM 的规范来定义内存模型的具体行为和实现细节。
八种操作:
问题:程序不知道主内存的值已经被修改过了,所以需要引入Volatile