Java 并发面试题, 什么是 Java 内存模型JMM?
Java 并发面试题, 什么是 Java 内存模型JMM?
QA
Step 1
Q:: 什么是 Java 内存模型(JMM)?
A:: Java 内存模型(Java Memory Model,
JMM)描述了 Java 虚拟机(JVM)如何在多线程环境下进行内存操作的规范。它定义了变量在不同线程之间的可见性以及指令重排序的规则。JMM 保证了一个线程对共享变量的写入对其他线程是可见的,从而避免了数据不一致问题。
Step 2
Q:: JMM 如何解决可见性问题?
A:: JMM 通过对 volatile 关键字、synchronized 关键字和 final 关键字的使用来解决可见性问题。volatile 关键字可以保证变量的可见性,synchronized 关键字通过锁机制来保证可见性和原子性,final 关键字可以保证在对象构造完成后,其他线程能够看到正确的值。
Step 3
Q:: JMM 中的指令重排序是怎样的?
A:: 指令重排序是编译器和处理器为了提高性能而对指令执行顺序进行优化的行为。JMM 通过内存屏障(Memory Barrier)和 happens-
before 规则来限制指令重排序,确保多线程程序的正确性。例如,synchronized 和 volatile 关键字可以创建内存屏障,阻止特定指令的重排序。
Step 4
Q:: 什么是 happens-
before 规则?
A:: happens-before 规则是 JMM 中的一组规定,用来确定两个操作的执行顺序。主要规则包括:程序顺序规则、监视器锁规则、volatile 变量规则、线程启动规则、线程终止规则、传递性规则。happens-
before 关系保证了前一个操作的结果对后一个操作是可见的。
Step 5
Q:: volatile 关键字的作用是什么?
A:: volatile 关键字可以保证变量的可见性和有序性。使用 volatile 修饰的变量在每次被线程访问时都会读取主内存中的最新值,并且对该变量的写操作会立即刷新到主内存中,确保所有线程都能看到最新的值。同时,volatile 变量的读写操作不会被指令重排序。
Step 6
Q:: synchronized 关键字的作用是什么?
A:: synchronized 关键字用于实现方法或代码块的互斥访问,确保同一时间只有一个线程可以执行被 synchronized 修饰的代码。它通过锁机制来保证线程安全,防止数据不一致问题。synchronized 还可以确保对共享变量的修改对其他线程可见,提供了内存可见性保障。