加入收藏 | 设为首页 | 会员中心 | 我要投稿 吉安站长网 (https://www.0796zz.com.cn/)- 科技、图像处理、媒体智能、办公协同、操作系统!
当前位置: 首页 > 站长资讯 > 评论 > 正文

在机器学习应用中需要吸取的经验和教训

发布时间:2021-02-17 11:32:05 所属栏目:评论 来源:互联网
导读:. volatile相关经典面试题 谈谈volatile的特性 volatile的内存语义 说说并发编程的3大特性 什么是内存可见性,什么是指令重排序? volatile是如何解决java并发中可见性的问题 volatile如何防止指令重排 volatile可以解决原子性嘛?为什么? volatile底层的实现

. volatile相关经典面试题

  • 谈谈volatile的特性
  • volatile的内存语义
  • 说说并发编程的3大特性
  • 什么是内存可见性,什么是指令重排序?
  • volatile是如何解决java并发中可见性的问题
  • volatile如何防止指令重排
  • volatile可以解决原子性嘛?为什么?
  • volatile底层的实现机制
  • volatile和synchronized的区别?

8.1 谈谈volatile的特性

 

内存屏障保证前面的指令先执行,所以这就保证了禁止了指令重排啦,同时内存屏障保证缓存写入内存和其他处理器缓存失效,这也就保证了可见性,哈哈~

7.volatile的典型场景

通常来说,使用volatile必须具备以下2个条件:

  • 1)对变量的写操作不依赖于当前值
  • 2)该变量没有包含在具有其他变量的不变式中

实际上,volatile场景一般就是「状态标志」,以及「DCL单例模式」。

7.1 状态标志

深入理解Java虚拟机,书中的例子:

 

ock指令相当于一个「内存屏障」,它保证以下这几点:

  • ❝1.重排序时不能把后面的指令重排序到内存屏障之前的位置
  • 2.将本处理器的缓存写入内存
  • 3.如果是写入动作,会导致其他处理器中对应的缓存无效。❞

显然,第2、3点不就是volatile保证可见性的体现嘛,第1点就是禁止指令重排列的体现。

内存屏障内存屏障四大分类:(Load 代表读取指令,Store代表写入指令)

内存屏障

 

显然,这里还不是底层,实际上volatile保证可见性和禁止指令重排都跟「内存屏障」有关,我们编译volatile相关代码看看~

DCL单例模式(volatile)&编译对比

DCL单例模式(Double Check Lock,双重检查锁)比较常用,它是需要volatile修饰的,所以就拿这段代码编译吧

 

  • 首先呢,flag加上volatile关键字,那就禁止了指令重排,也就是1 happens-before 2了
  • 根据「volatile变量规则」,2 happens-before 3
  • 由「程序次序规则」,得出 3 happens-before 4
  • 最后由「传递性」,得出1 happens-before 4,因此妥妥的输出sum=2啦~

6.volatile底层原理

以上讨论学习,我们知道volatile的语义就是保证变量对所有线程可见性以及禁止指令重排优化。那么,它的底层是如何保证可见性和禁止指令重排的呢?

图解volatile是如何保证可见性的?

在这里,先看几个图吧,哈哈~

假设flag变量的初始值false,现在有两条线程t1和t2要访问它,就可以简化为以下图:


(编辑:吉安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读