java volatile的理解 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/04 09:20:48 2023/08/04
641 1 1
【摘要】 Java中的volatile关键字是用来修饰变量的,它的作用是保证变量的可见性和禁止指令重排序。 当一个变量被volatile修饰时,它具有以下特性:可见性:当一个线程修改了volatile修饰的变量的值,其他线程能够立即看到修改后的值。这是由于volatile修饰的变量会直接存储在主内存中,每个线程读取变量时都会从主内存中获取最新的值。禁止指令重排序:编译器和处理器在不改变程序语义的前提下...

Java中的volatile关键字是用来修饰变量的,它的作用是保证变量的可见性和禁止指令重排序。 当一个变量被volatile修饰时,它具有以下特性:

  1. 可见性:当一个线程修改了volatile修饰的变量的值,其他线程能够立即看到修改后的值。这是由于volatile修饰的变量会直接存储在主内存中,每个线程读取变量时都会从主内存中获取最新的值。
  2. 禁止指令重排序:编译器和处理器在不改变程序语义的前提下,会对指令进行重排序优化以提高程序执行效率。然而,对于volatile变量的读写操作,编译器和处理器会禁止重排序,保证指令的执行顺序与程序的顺序一致。 示例代码如下:
javaCopy codepublic class VolatileExample {
    private volatile boolean flag = false;
    public void writer() {
        flag = true;  // 写入volatile变量
    }
    public void reader() {
        while (!flag) {  // 读取volatile变量
            // do something
        }
    }
}

在上述代码中,有一个boolean类型的volatile变量flag。在writer方法中,将flag设置为true,而在reader方法中,通过不断循环读取flag的值,直到flag变为true时退出循环。 由于flag是volatile修饰的,所以在writer方法中修改flag的值后,reader方法中能够立即看到这个修改。这保证了可见性。 另外,由于reader方法中的循环条件中涉及到对flag的读取操作,而flag是volatile修饰的,所以编译器和处理器会禁止重排序,保证了指令的执行顺序与程序的顺序一致。这保证了禁止指令重排序。 需要注意的是,尽管volatile修饰的变量具有可见性和禁止指令重排序的特性,但并不能保证原子性。如果需要保证原子性操作,应该使用其他的同步机制,比如synchronized关键字或者Lock接口。

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

作者其他文章

评论(1

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

全部回复

上滑加载中

设置昵称

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

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

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