更新时间:2023-03-28 来源:黑马程序员 浏览量:
Java的内存模型定义了Java程序在运行时的内存结构以及多线程情况下,多个线程之间如何共享内存。Java的内存模型保证了线程安全性,避免了多线程访问共享内存时出现的数据竞争、死锁等问题。
Java内存模型将内存分为两个部分:线程工作内存和主内存。线程工作内存是线程独有的内存空间,用于存储线程运行时的局部变量等数据,而主内存是所有线程共享的内存空间,用于存储Java程序中定义的全局变量等数据。
Java内存模型定义了一组规则,确保多个线程之间对共享内存的访问是正确的。其中包括:
·可见性:当一个线程修改了共享变量的值后,其他线程可以立即看到该变量的修改。
·原子性:对共享变量的读写操作应该被视为一个原子操作,不可被中断。
·有序性:线程之间的操作可能会被编译器、处理器进行指令重排等优化,但是Java内存模型保证了操作执行的顺序不会影响程序的正确性。
我们用一个简单的代码示例,展示了Java内存模型的可见性特性:
public class Main { private static boolean flag = false; public static void main(String[] args) throws InterruptedException { new Thread(() -> { while (!flag) { // 线程1不断检查flag的值 // do nothing } System.out.println("Thread 1 finished"); }).start(); Thread.sleep(1000); flag = true; // 主线程修改flag的值 System.out.println("Main thread finished"); } }
在这个例子中,程序开启了两个线程,其中线程1不断检查flag变量的值,直到它被修改为true。在主线程中,程序在等待了一段时间后将flag变量的值修改为true。
由于Java内存模型的可见性特性,当主线程修改flag变量的值时,线程1应该能够立即看到flag的值已经被修改为true,于是线程1退出循环并打印出"Thread 1 finished",然后程序结束。