Java最全面试时通过volatile关键字,全面展示线程内存模型的能力,那些年Java面试官常问的知识点

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

大厂面试真题:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

面试时,面试官经常会通过volatile关键字来考核候选人在多线程方面的能力,一旦被问题此类问题,大家可以通过如下的步骤全面这方面的能力。

1 首先通过内存模型说明volatile关键字的作用

先说明,用volatile修饰的变量,能直接修改内存内容,修改后的变量对其他线程是可见的。然后展开说明如下的内容。

多线程并发操作同一资源时,可能会出现最终结果和预期不同的情况,刚才我们也已经通过线程安全和不安全相关的案例,直观地看到了这一情况,这里我们将通过线程的内存结构来详细分析下造成“最终结果不一致”的原因。

如果某个线程要操作data变量,该线程会先把data变量装载到线程内部的内存中做个副本,之后线程就不再和在主内存中的data变量有任何关系,而是会操作副本变量的值,操作完成后,再把这个副本回写到主内存(也就是堆内存)中,这个过程如下图所示。

假设data的初始值是0,有100个线程并发地对它进行加1操作,预期的运行结果是100。但在实际的操作过程中,假设A线程和B线程并发地data,其中A读到的值是0,B读到的是1。当B在它的线程内部内存中完成加1操作(data变成2),会把data回写到主内存里,这时主内存里的data也是2。

但之后,A线程也完成了加1操作(此时A内部线程中的data副本是1),在之后的回写过程中,会把主内存中的data变量从2设置成1,这样就造成数据不一致的问题了。

但是,如果data变量被volatile变量修饰,那么A线程修改好的data变量,无需等到“”回写“”阶段,能直接写回到主内存里,这就能导致该变量对其它线程“立即可见”。

2 同时说明,volatile不能解决数据不一致的问题

如果某个变量之前加了volatile,线程在每次使用该变量时,都会从主内存中读取该变量最新的值,而且,某线程一旦修改了该变量,这个修改会立即回写到主内存里。

既然是在操作前会从主内存中读取变量最新的值,而且每次修改后都会立即回写到主内存,这样的话是否能解决多线程中数据不一致的问题呢?通过下面的VolilateDemo.java代码,我们来看下这个问题的答案。

1 public class VolilateDemo extends Thread {
2 //启动1000个线程,对这个被volatile修饰的变量进行加1操作
3 public static volatile int cnt = 0;
4 public static void add() {
5 // 延迟1毫秒,增加多线程并发抢占的概率
6 try { Thread.sleep(1);}
7 catch (InterruptedException e) { }
8 cnt++;//加操作
9 }
10 public static void main(String[] args) {
11 // 同时启动1000个线程,去进行加操作
12 for (int i = 0; i < 1000; i++) {
13 new Thread(new Runnable() {
14 public void run()
15 {VolilateDemo.add(); }
16 }).start();
17 }
18 System.out.println("Result is " + VolilateDemo.cnt);
19 }
20 }

在main函数的第12行里,通过for循环启动1000个线程。从第13到16行里,我们通过了Runnable类定义了线程的动作,每个线程启动后,会调用第15行的add方法对用volatile修饰的cnt变量进行加1操作。

多次运行的结果可能不一样,但在大多数情况下,最终cnt的值会小于1000,也就是说,用volatile修饰的变量不能保证数据一致性,换句话说,volatile不能当锁来用,因为它不能保证主内存的变量在同一时间段里只被一个线程操作。

3 然后说下volatile的作用

那么volatile有什么用呢?被volatile修饰的变量每次在使用时,不是从各线程的内部内存中拿,而是从主内存中拿。这样就能避免“创建副本”到“把副本回写到主内存中”等的操作,从而能提升效率。

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

需要这份系统化的资料的朋友,可以点击这里获取

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值