Java并发面试题, 什么是 Java 内存模型JMM?
Java并发面试题, 什么是 Java 内存模型JMM?
QA
Step 1
Q:: 什么是 Java 内存模型(JMM)?
A:: Java 内存模型(Java Memory Model,
JMM)定义了在多线程环境中,Java 虚拟机如何同步线程对内存的访问。它规定了变量的读取和写入操作如何在主内存和各线程的工作内存(缓存)之间传递。JMM 通过控制内存可见性和指令重排序来保证线程安全。
Step 2
Q:: Java 内存模型是如何保证可见性、原子性和有序性的?
A:: Java 内存模型通过以下机制保证:
1.
可见性:使用 volatile 关键字、锁(synchronized 关键字)和 final 关键字。
2.
原子性:对于基本类型的读写操作是原子的,使用锁和原子类(如 AtomicInteger)可以保证更复杂的原子操作。
3. 有序性:JMM 通过 happens-
before 关系来约束指令的执行顺序,例如,监视器锁的释放和获取、volatile 变量的写入和读取等。
Step 3
Q:: 什么是 volatile 关键字?它的作用是什么?
A:: volatile 关键字用于修饰变量,确保变量的修改对所有线程立即可见。它还禁止指令重排序优化,从而保证了有序性。volatile 变量适用于一些简单的状态标志或轻量级的读写操作,但不能代替锁。
Step 4
Q:: 什么是指令重排序?
A:: 指令重排序是编译器和处理器为了提高性能,对指令执行顺序进行调整的行为。JMM 通过定义 happens-before 关系来约束这种重排序,以保证多线程程序的正确性。例如,volatile 变量的写入和读取、synchronized 代码块内的操作等都会建立 happens-
before 关系。
Step 5
Q:: Java 如何使用 synchronized 关键字实现线程安全?
A:: synchronized 关键字用于修饰方法或代码块,确保在同一时刻只有一个线程可以执行该代码。它通过内置的监视器锁来实现互斥访问,从而保证了线程的安全性。此外,synchronized 也建立了 happens-
before 关系,确保了可见性和有序性。