首页 > 其他分享 >happen before

happen before

时间:2024-01-22 22:14:58浏览次数:27  
标签:语句 顺序 代码 编译器 事件 happen before

引用

what?

  • 小明: 这是个什么东西?
  • 小红: 这是一个概念,一个对编译器/cpu执行代码的约束,当然也可以用来约束其他行为
  • 小明: 啊?代码不就是一行行执行吗?是有什么特殊的情况吗?
  • 小红: no,实际上我们写的代码,编译器/cpu都可能进行重排序,实际上的顺序已经不是我们写代码的顺序了.
  • 小明: 我草,那他喵我写的代码结果不就都乱了,把我代码的顺序都打乱.
  • 小红: 所以啊,这就是对编译器/cpu排序做的要求,你他喵顺便排,但是一定要和我写代码的结果一样就行了.
  • 小明: 原来如此,就是针对重排序要求的一个底线.

总结:

  • 如果编码中,语句一在语句二之前执行,那么要求最终结果看起来要像语句一在语句二之后执行,看起来有先后顺序.
  • 字面意思: 发生之前
  • 一般主语是 某个事件,介词后一般也是某个事件.
    • 错误理解:例如事件A happen before 事件B,从字面意思上说是 事件A发生在事件B之前.
    • 其实他要求如果事件A happen before 事件B,他只是要求从最终结果来看:事件A的结果在事件B之前就够了
    • 实际上,事件A/B的发生顺序他才不管.

为什么要这么个原则,看起来不能说毫无作用,只能说屁用没有?

  • 我们程序员写代码时,是要求内存模型易于理解,易于编程,所以我们需要依赖一个强内存模型来编码。 也就是说向公理一样,定义好的规则,我们遵守规则写代码就完事了。
  • 对于编译器和处理器的实现来说,它们希望约束尽量少一些,毕竟你限制它们肯定影响它们的执行效率,不能让他们尽己所能的优化来提供性能。所以他们需要一个弱内存模型。
  • 哦哦,原来是执行器可能会把我们写的代码顺序优化得乱七八糟,那么我们要对他做一个要求,那就是从结果看,像是我们代码写的顺序执行的结果

实例

  • 有这么一段简单的代码
int i = 1;  //语句一
i = i + 5;  //语句二
int j = 2;  //语句三
j = j +4;   //语句四
  • 就是这么一段简单的代码,java在同一线程中,顺序需要和语言读起来一样.实际上呢,只要结果一样,其他都不管你,所以顺序是下图这样完全没有问题
int i = 1;
int j = 2;
i = i + 5;
j = j + 4;
  • 我们分析下,实际上语句三先于语句二,有关系吗?
  • 没关系.最后结果没有问题就ok

标签:语句,顺序,代码,编译器,事件,happen,before
From: https://www.cnblogs.com/cgengwei/p/17981177

相关文章

  • Android RECYCLEVIEWscrollbarDefaultDelayBeforeFade 源码
    AndroidRecyclerViewscrollbarDefaultDelayBeforeFade源码实现简介在Android开发中,RecyclerView是一个常用的控件,用于展示大数据集合的列表或网格。RecyclerView提供了一些自定义的属性和方法,方便开发者根据需求进行定制。其中一个常用的属性是scrollbarDefaultDelayBefo......
  • java中 Happens-Before 原则
    前言并发问题有三个根本原因:cpu缓存导致可见性问题线程切换导致原子性问题:线程切换是发生于任何一条cpu指令级别的,而不是高级语言中的语句,例如i++是三个cpu指令编译器优化导致有序性问题CPU缓存导致可见性问题与Java内存模型(JMM)的问题实际上是两个相互关联的概念。CPU......
  • elixir before_compile && on_definition 简单使用
    elixir提供了一些方便的模块属性,可以让我们方便的进行elixir的扩展(尤其是进行元编程的时候)比如elixir_agent就使用到了before_compile以及on_definition,方便进行trace的处理on_definition的简单使用参考demo内容来自官方,可以实现输出函数的一些信息 defm......
  • C. Training Before the Olympiad
    原题链接题解事实1.两个数合并后的数一定是偶数事实2.如果没有发生奇数和偶数合并,那么最终的结果一定是所有数的和事实3.每发生一次奇数和偶数合并,最后的结果会减一总结综上所述,Masha会尽量选择同奇或同偶合并,但在有同奇的情况下,会优先选择同奇,因为合并会产生偶数,且Olya需要......
  • CF1916C Training Before the Olympiad
    思路首先,我们可以考虑两个人会怎么操作,如果是选择了两个偶数和两个奇数,那么答案不会减小,如果选择了一个奇数一个偶数,那么答案会减小一。所以想使答案大的人应该尽量选择前一种方案,想使答案小的人应该尽量选择后一种方案。但这还不是最优的,想使答案大的人在可以选择两个奇数时,绝......
  • css中的::after和::before
    先来看一个::before和::after的例子,给一个元素的前后再不添加新的元素的时候增加内容:<viewclass="info-before">测试before和after</view>.info-before{font-weight:bold;margin:30px;}.info-before::before{content:"添加在::before";......
  • after before compareTo
    入场日期要求晚于该人员在系统中登记的最后一次离场日期Java根据以上代码需求例子importjava.sql.*;importjava.util.Date;publicclassMain{publicstaticvoidmain(String[]args){//根据实际情况,替换以下连接信息Stringurl="jdbc:mysql:......
  • 关于 FontAwesome icon 的 before 伪元素
    看下图这个放大镜的例子:.fa-search:before是一个CSS选择器,它被用于指定某个具有类名为"fa-search"的元素的伪元素":before"。这个样式规则的作用是在该元素的内容之前插入一个字符,具体的字符是"\f002"。在这里,"\f002"是一个Unicode字符码,它通常用于表示字体图标。FontA......
  • 关于 Web 开发中的 CSS before 伪元素
    我用Chrome打开一个网页后,F12打开Chrome开发者工具,在Elements面板观察到一些DOM元素有::before,这是什么含义?在Web前端开发中,::before是CSS伪元素之一,它用于在指定元素的内容前插入生成的内容。这个伪元素允许开发者通过CSS样式向元素的前部添加额外的内容,而无需修......
  • 解决:Expected 1 line break before closing bracket, but no line breaks found.eslin
    运行时报错以下 解决在eslintrc.jsrules下添加以下代码'vue/singleline-html-element-content-newline':'off','vue/multiline-html-element-content-newline':'off', ......