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

java happen-before六条原则,看起来平平无奇,怎么理解?

  • happen-before其实最精髓在于传递性这个原则
  • 啊?为什么?
  • 因为如果存在多线程的场景,那么就意味着其他五条都是边界条件,发生了其他五个事情,程序就必须把缓存刷到内存中。
  • 额,我再细品一下。
posted @ 2024-01-22 21:54  躲在墙角的  阅读(1)  评论(0编辑  收藏  举报