首页常见问题正文

什么是Java的内存模型?

更新时间:2023-03-28 来源:黑马程序员 浏览量:

IT培训班

  Java的内存模型定义了Java程序在运行时的内存结构以及多线程情况下,多个线程之间如何共享内存。Java的内存模型保证了线程安全性,避免了多线程访问共享内存时出现的数据竞争、死锁等问题。

  Java内存模型将内存分为两个部分:线程工作内存和主内存。线程工作内存是线程独有的内存空间,用于存储线程运行时的局部变量等数据,而主内存是所有线程共享的内存空间,用于存储Java程序中定义的全局变量等数据。

  Java内存模型定义了一组规则,确保多个线程之间对共享内存的访问是正确的。其中包括:

  ·可见性:当一个线程修改了共享变量的值后,其他线程可以立即看到该变量的修改。

  ·原子性:对共享变量的读写操作应该被视为一个原子操作,不可被中断。

1679973269899_什么是Java内存模型?.jpg

  ·有序性:线程之间的操作可能会被编译器、处理器进行指令重排等优化,但是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",然后程序结束。

分享到:
在线咨询 我要报名
和我们在线交谈!