Java中happens-befor的规则和用法

发布时间:2021-09-04 18:02:21 作者:chen
来源:亿速云 阅读:120

这篇文章主要介绍“Java中happens-befor的规则和用法”,在日常操作中,相信很多人在Java中happens-befor的规则和用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中happens-befor的规则和用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、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-befor的规则和用法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. 关于Java规则引擎Easy Rules的用法
  2. java中枚举的介绍和用法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java内存模型happens-before的简单介绍

下一篇:MySQL中的隐藏列的具体查看方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》