在接下来的叙述里我首先会说明happens-before规则是干什么用的,然后用一个简单的小程序说明happens-before规则

一、happens-before规则

我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens-before规则,不能说你想怎么排就怎么排,如果那样岂不是乱了套。

happens-before部分规则如下:

1、程序顺序规则:一个线程中的每个操作happens-before于该线程中的任意后续操作

2、监视器锁(同步)规则:对于一个监视器的解锁,happens-before于随后对这个监视器的加锁

注1:为什么是部分happens-before原则,因为这篇文章是让你理解happens-before原则,我会尽量让你专注在这件事情上不被其他的所影响

注2:程序顺序规则中所说的每个操作happens-before于该线程中的任意后续操作并不是说前一个操作必须要在后一个操作之前执行,而是指前一个操作的执行结果必须对后一个操作可见,如果不满足这个要求那就不允许这两个操作进行重排序

二、例:下面的方法的功能是计算一个长方形面积

public double rectangleArea(double length , double width){

double leng;

double wid;

leng=length;//A

wid=width;//B

double area=leng*wid;//C

return area;

}

上面的操作在运行之前编译器和处理器可能会进行优化

在程序中

A  happens-before  B

B  happens-before C

A  happens-before C //happens-before具有传递规则

根据happens-before规则我们来分析重排序后可能产生的结果

因为A  happens-before  B,所以A操作产生的结果leng一定要对B操作可见,但是现在B操作并没有用到length,所以这两个操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作进行了重排序,因为leng没有被赋值,所以leng=0,area=0*wid也就是area=0;这个结果显然是错误的,所以A操作是不能和C操作进行重排序的(这就是注2中说的前一个操作的执行结果必须对后羿操作可见,如果不满足这个要求就不允许这两个操作进行重排序)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java happens before_简单易懂讲解happens-before原则相关推荐

  1. kibana显示JAVA,elasticsearch kibana简单查询讲解

    一.简单的CRUD操作 1.添加 PUT /index/type/id { "json数据" } 2.查询 GET /index/type/id 3.修改 POST /index/ ...

  2. OpenCV绘制透明底的图片,简单易懂讲解alpha通道怎么用

    今天忽然想做抠图和图形绘制,那这里就涉及到一个透明底的问题 OpenCV是很强大的,但是网上大多教程并没有讲清楚 alpha 通道的参数怎么设置 首先我们来看最简单的非 alpha 通道代码: imp ...

  3. Python实现二分查找算法,图片结合代码讲解,简单易懂

    Python实现二分查找算法,图片结合代码讲解,简单易懂 二分查找是指在一个数组中循环找到特定的目标元素的一种算法,二分查找算法要求这个数组必须是有序的,如果不是有序则最后得出的结果是不准确的,因为其 ...

  4. 详细讲解用Python列表for循环还有if判断语句写出1-100之内的素数,思路清晰语法准确代码简单易懂实用

    详细讲解用Python列表for循环还有if判断语句写出1-100之内的素数,思路清晰语法准确代码简单易懂实用,当然还有一定技巧的算法渗透其中.请看视频: Python 代码实例,找出1-100之内的 ...

  5. 初识 java(简单易懂入门篇)

    引言 java语言是Sun公司在1990年由James Gosling创建的(Sun公司现已被Oracle甲骨文公司收购),在1995年才公布,java创始人James Gosling通过C++创造了 ...

  6. java中删除sqlite数据库语句_sqlite数据库的介绍与java操作sqlite的实例讲解

    sqlite数据库的介绍与java操作sqlite的实例讲解 发布时间:2020-10-03 05:40:34 来源:脚本之家 阅读:92 作者:Lee_Tech sqlite是啥? 1.一种轻型数据 ...

  7. 公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂

    ↑ 点击上方[计算机视觉联盟]关注我们 K近邻算法采用测量不同特征值之间的距离方法进行分类. K-近邻算法工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知 ...

  8. JavaScript面向对象--继承 (超简单易懂,小白专属)...

    JavaScript面向对象--继承 (超简单易懂,小白专属) 一.继承的概念 子类共享父类的数据和方法的行为,就叫继承. 二.E55如何实现继承?探索JavaScript继承的本质 2.1构造函数之 ...

  9. 【转】区块链是什么,如何简单易懂地介绍区块链?

    作者:知乎用户 链接:https://www.zhihu.com/question/37290469 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 友情提醒:比特币 ...

最新文章

  1. d3 力导向图 force graph
  2. 线性表的链式存储结构(C语言版)
  3. VUE v-bind绑定class和style
  4. sjf调度算法_如何通过静态方法预测SJF调度中未来过程的突发时间?
  5. linux扩容根目录空间_Linux系统扩容根目录磁盘空间的操作方法
  6. for in range语句_Python 之旅5——for循环
  7. NET 4.0 System.Threading.Tasks学习笔记
  8. arraycolumn php5.4以下怎么用,兼容php5.4和更低版本php的array_column公共方法
  9. Java实验报告2021
  10. [CI、CD入门]maven打包可执行程序之微服务-服务提供者篇
  11. 步进电机转速 与 pwm 关系
  12. 《引爆点》学习笔记二
  13. 明明有QQ,凭什么微信能火?——QQ微信横向对比分析
  14. java specification_java规范(Java specification).doc
  15. bmi计算器公式_BMI 计算器
  16. Android Studio 连真机提示No Device Found,adb.exe无法找到入口
  17. 微信斑马系统:微信朋友圈广告背后的利器
  18. 工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA
  19. PostgreSQL数据库动态共享内存管理器——dynamic shared memory segment
  20. 视频点播服务器的配置如何选择,需要多大的带宽

热门文章

  1. ResultSet 中找不到栏位名称 XXXX使用remapResults参数来解决
  2. Linux 下清理系统缓存并释放内存
  3. 使用mybatis-plus基于BaseMapper的Page对象按条件分页查询
  4. 通过支付宝完成阿里云个人账号实名认证的方法 新手必看的教程
  5. cocos2dx 植物大战僵尸 22 寒冰射手
  6. 伪静态规则写法RewriteRule-htaccess详细语法使用
  7. Android-Gallery画廊
  8. php nginx 域名重定向,Nginx 重定向时获取域名
  9. 如何恢复回收站?数据恢复,这4招就够了!
  10. Mysql连接查询的优化