【面试官】volatile有什么缺点吗?

  • 面试官:重排序知道吧?
  • 面试官:那重排序不会有什么问题吗?
  • 面试官:有什么办法可以解决?
  • 面试官:那volatile可见性的原理是什么?
  • 面试官:volatile有什么缺点吗?

大家好,我是南哥。

一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。

文章目录

  1. 指令重排序
    1. 重排序是什么
    2. 重排序的问题
  2. volatile
    1. volatile特性
    2. 可见性原理
    3. volatile局限性

1. 指令重排序

1.1 重排序是什么

面试官:重排序知道吧?

指令重排序字面上听起来很高级,但只要理解了并不难掌握。我们先来看看指令重排序究竟有什么作用。

指令重排序的主要作用是可以优化编译器和处理器的执行效率,提高程序性能。例如多条执行顺序不同的指令,可以重排序让轻耗时的指令先执行,从而让出CPU流水线资源供其他指令使用。

但如果指令之间存在着数据依赖关系,则编译器和处理器不会对相关操作进行指令重排序,避免程序执行结果改变。这个规则也称为as-if-serial语义。例如以下代码。

String book = "JavaGetOffer"; // A
String avator = "思考的陈"; // B
String msg = book + abator; // C

对于A、B,它们之间并没有依赖关系,谁先执行对程序的结果没有任何影响。但C却依赖于A、B,不能出现类似C -> A -> B或C -> B -> A或A -> C -> B或B -> C -> A之类的指令重排,否则程序执行结果将改变。

1.2 重排序的问题

面试官:那重排序不会有什么问题吗?

在单线程环境下,有as-if-serial语义的保护,我们无需担心程序执行结果被改变。但在多线程环境下,指令重排序会出现数据不一致的问题。举个多线程的例子方便大家理解。

int number = 0;
       boolean flag = false;
       public void method1() {
           number = 6;                // A
           flag = true;               // B
       }
       public void method2() {
           if (flag) {               // C
               int i = number * 6;   // D
          

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试突击大厂 文章被收录于专栏

👉以面试官面试的形式,涵盖了你怒怼大厂面试官、拿下大厂面试所需掌握的核心知识、面试重点 👉相信一定对你顺利通关面试、拿到理想Offer有所帮助 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力

全部评论

相关推荐

14 41 评论
分享
牛客网
牛客企业服务