👌什么是java内存模型

👌什么是java内存模型?

题目详细答案

Java 内存模型(Java Memory Model, JMM)是 Java 虚拟机规范的一部分,定义了多线程环境下共享变量的访问规则以及不同线程之间如何通过内存进行交互。JMM 主要解决在多线程编程中可能出现的可见性、原子性和有序性问题。

关键概念

线程与主内存

每个线程都有自己的工作内存(也称为本地内存),工作内存保存了该线程使用到的变量的副本。主内存是共享内存区域,所有线程都可以访问主内存中的变量。

可见性

可见性问题是指一个线程对共享变量的修改,另一个线程是否能够立即看到。JMM 通过volatile关键字、锁机制(如synchronized)等来保证变量的可见性。

原子性

原子性问题是指一个操作是否是不可分割的,即操作要么全部执行完成,要么完全不执行。JMM 保证了基本数据类型的读写操作的原子性,但对于复合操作(如 i++)则不保证。

有序性

有序性问题是指代码执行的顺序是否与程序的顺序一致。编译器和处理器可能会对指令进行重排序,以提高性能。JMM 通过volatile关键字、锁机制等来保证必要的有序性。

内存模型中的同步机制

volatile关键字

volatile变量保证了对该变量的读写操作的可见性和有序性。

读volatile变量时,总是从主内存中读取最新的值。

写volatile变量时,总是将最新的值写回主内存。

synchronized关键字:

synchronized块或方法保证了进入临界区的线程对共享变量的独占访问。

退出synchronized块时,会将工作内存中的变量更新到主内存。

进入synchronized块时,会从主内存中读取最新的变量值。

final关键字:

final变量在构造器中初始化后,其他线程可以立即看到初始化后的值。

final变量的引用不会被修改,因此可以确保其可见性。

可见性问题示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class VisibilityExample {
private static boolean stop = false;

public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (!stop) {
// busy-wait
}
});
thread.start();

Thread.sleep(1000);
stop = true; // 另一个线程可能不会立即看到这个修改
}
}

主线程修改了stop变量,但另一个线程可能不会立即看到修改,导致循环无法终止。可以使用volatile关键字解决这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class VisibilityExample {
private static volatile boolean stop = false;

public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (!stop) {
// busy-wait
}
});
thread.start();

Thread.sleep(1000);
stop = true; // 另一个线程会立即看到这个修改
}
}
 wechat
天生我才必有用