美团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;
- 线程A读取number的数值
- 线程B读取number的数值
- 线程B直行+1
- 线程B写入最新的number数值
- 主内存:number =6
- 线程B工作内存:number = 6;
- 但是:线程A的工作内存 number = 5.
看完运转流程:等线程A完成工作的那一刻:往主内存中写入的还是6.也就以为这数值结果和我们期待的500不一样的,因此不能保障原子性。
学习资料下载地址:
https://github.com/Zhaoyangyang/bestpromotion/blob/master/demo/VolatileDemo.java
以上是关于美团2020面试题:基于volatile变量的运算在并发下是安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章
java面试题及答案2020,java面试题汇总, java最新面试题及答案2020 四