zoukankan      html  css  js  c++  java
  • 面试题:happen-before原则和as-if-serial语义

    一、as-if-serial

    as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提供并行度),(单线程)程序的执行结果不能被改变。编译器,runtime和处理器都必须遵守as-if-serial语义。as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,runtime和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的

    二、happen-before 原则

    JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程中执行。如果A Happens-Before B,那么可以保证,当A操作执行完后,A操作的执行结果对B操作是可见的

    1. 程序顺序规则:在同一个线程中,书写在前面的操作happen-before后面的操作。
    2. volatile变量规则:对一个volatile域的写,happens-before于任意后续对此变量的操作。
    3. 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
    4. 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
    5. start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
    6. join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。
    7. 程序中断规则:对线程interrupted()方法的调用happens-before于被中断线程的代码检测到中断时间的发生。
    8. 对象finalize规则:一个对象的初始化完成(构造函数执行结束)happens-before于它的finalize()方法的开始。

    happen-before 在这里不能理解成在什么之前发生,它和时间没有任何关系。个人感觉解释成“生效可见于” 更准确。下面通过对这八个原则详细解释来加深对“生效可见于”的理解。

    三、区别

    1. as-if-serial语义保证单线程内程序的执行结果不被改变,happens-before关系保证正确同步的多线程程序的执行结果不被改变。
    2. as-if-serial语义给编写单线程程序的程序员创造了一个幻境:单线程程序是按程序的顺序来执行的。happens-before关系给编写正确同步的多线程程序的程序员创造了一个幻境:正确同步的多线程程序是按happens-before指定的顺序来执行的。
    3. as-if-serial语义和happens-before这么做的目的,都是为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度。
  • 相关阅读:
    css3-10 如何使用滚动条
    jquery如何实现点击标题收缩下面的内容
    js 字符串操作函数有哪些
    好记性不如烂笔头85-spring3学习(6)-BeanFactory 于bean生命周期
    【电视桌面CSWUI】电视桌面(launcher)截图欣赏
    OR1200数据Cache运用情景分析
    Spring3.0学习笔记文档的官方网站(六)--3.4.1
    or1200乘法除法指令解释
    C++使用简单的函数指针
    jQuery表格排序总成-tablesorter
  • 原文地址:https://www.cnblogs.com/dalianpai/p/14212690.html
Copyright © 2011-2022 走看看