美团2020面试题:基于volatile变量的运算在并发下是安全的吗?

Posted 码农搬砖_2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了美团2020面试题:基于volatile变量的运算在并发下是安全的吗?相关的知识,希望对你有一定的参考价值。

答案:不安全(不可以保证变量符合操作的原子性)

案例分析:

public class VolatileDemo 
    private volatile int number = 0;
    public int getNumber() 
        return number;
    

    public void add() 
        number++;
    

    public static void main(String[] args) 
        VolatileDemo volatileDemo = new VolatileDemo();
        for (int i = 0; i < 500; i++) 

            new Thread(new Runnable() 
                @Override
                public void run() 
                    volatileDemo.add();
                
            ).start();
        

        // 如果线程个数大于1,那么主线程让出资源,直到所有子线程都运行完成,主线程再次直行。
     while(Thread.activeCount() > 1)
         Thread.yield();
     

     System.out.println("number"+ volatileDemo.getNumber());
    

这个输出结果不一定是500.

首先:number++ 不是一个原子操作

number ++ 要执行三步操作:

读取number的数值
+1 操作
写最新的number数值到内存

让我们模拟一下程序可能的运转流程

假设此时number = 5;

  1. 线程A读取number的数值
  2. 线程B读取number的数值
  3. 线程B直行+1
  4. 线程B写入最新的number数值
  5. 主内存:number =6
  6. 线程B工作内存:number = 6;
  7. 但是:线程A的工作内存 number = 5.

看完运转流程:等线程A完成工作的那一刻:往主内存中写入的还是6.也就以为这数值结果和我们期待的500不一样的,因此不能保障原子性。

学习资料下载地址:

https://github.com/Zhaoyangyang/bestpromotion/blob/master/demo/VolatileDemo.java

以上是关于美团2020面试题:基于volatile变量的运算在并发下是安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章

美团面试题:DCL单例模式需不需要volatile?

java面试题及答案2020,java面试题汇总, java最新面试题及答案2020 四

43道多线程面试题,附带答案

2020美团(开水团)面试题真题整理最新最全~持续更新中~~~

Java面试题5

阿里历年经典Java面试题汇总