Java中Volatile关键字详解及代码示例

举报
林欣 发表于 2024/06/24 11:36:27 2024/06/24
【摘要】 背景知识volatile 是 Java 中的一个关键字,主要用于确保多线程环境下的变量可见性和禁止指令重排序。当一个变量被声明为 volatile 时,它告诉 JVM 和其他线程,这个变量是不稳定的,每次使用它的时候都必须从主内存中读取,而当它改变时也必须立即同步回主内存。这可以确保多个线程在访问这个变量时能够获取到最新的值。 可见性在多线程环境中,每个线程都有自己的工作内存(也称为本地内...

背景知识

volatile 是 Java 中的一个关键字,主要用于确保多线程环境下的变量可见性和禁止指令重排序。当一个变量被声明为 volatile 时,它告诉 JVM 和其他线程,这个变量是不稳定的,每次使用它的时候都必须从主内存中读取,而当它改变时也必须立即同步回主内存。这可以确保多个线程在访问这个变量时能够获取到最新的值。

可见性

在多线程环境中,每个线程都有自己的工作内存(也称为本地内存),线程之间共享的数据存储在主内存中。当线程需要读取或修改共享数据时,它首先会在自己的工作内存中复制一份,完成操作后再将结果写回主内存。这种机制可能导致一个线程修改了共享变量的值,但其他线程无法立即看到这个修改,这就是所谓的“可见性问题”。volatile 关键字可以确保所有线程都能看到共享变量的最新值。

禁止指令重排序

在 Java 虚拟机中,为了提高执行效率,编译器和处理器可能会对指令进行重排序。但是,这种重排序可能会违反程序的语义。volatile 关键字可以禁止这种重排序,确保程序按照代码的顺序来执行。

代码示例

下面是一个简单的示例,展示了 volatile 关键字的使用:

public class VolatileExample {
    // 使用 volatile 关键字修饰的变量
    private volatile boolean flag = false;

    // 启动一个新线程来修改 flag 的值
    public void startThread() {
        new Thread(() -> {
            try {
                // 等待一段时间,确保主线程已经开始运行
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 修改 flag 的值
            flag = true;
            System.out.println("Flag in thread: " + flag);
        }).start();
    }

    public void mainLoop() {
        while (!flag) {
            // 循环检查 flag 的值,直到它为 true
            // 由于 flag 是 volatile 的,所以每次循环都会从主内存中读取它的值
            System.out.println("Waiting for flag to become true...");
        }
        System.out.println("Flag in main thread: " + flag);
    }

    public static void main(String[] args) {
        VolatileExample example = new VolatileExample();
        example.startThread(); // 启动一个新线程来修改 flag 的值
        example.mainLoop(); // 在主线程中循环检查 flag 的值
    }
}

在这个示例中,我们创建了一个 volatile 变量 flag,并在一个新线程中修改它的值。在主线程中,我们通过一个循环来检查 flag 的值,直到它变为 true。由于 flagvolatile 的,所以每次循环都会从主内存中读取它的值,确保我们能看到最新的修改。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。