简单易懂讲解happens-before原则
在接下来的叙述里我首先会说明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中说的前一个操作的执行结果必须对后羿操作可见,如果不满足这个要求就不允许这两个操作进行重排序)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- 通俗易懂讲解happens-before原则
- 通俗易懂讲解happens-before原则
- 通俗易懂讲解happens-before原则
- Happens-before原则
- 简单易懂的讲解深度学习(入门系列之八)
- 简单易懂的讲解深度学习(入门系列之九)
- 关于java 泛型的简单易懂 视频讲解
- 【转载】C# 中的委托和事件(详解:简单易懂的讲解)
- 简单易懂的Dancing links讲解(3)
- Java并发11:Java内存模型、指令重排、内存屏障、happens-before原则
- Java先行发生(happens-before)原则
- java并发编程基础--先行发生原则( happens-before)与指令重排序
- 先行发生原则(Happens-before)
- Java内存 happens-before原则
- 学习笔记之Java线程安全杂谈(中)——Java内存模型、happens-before原则和DCL问题
- 简单易懂的Dancing links讲解(2)
- Java并发编程系列之四:happens-before原则
- 简单易懂的Dancing links讲解(3)
- 简单易懂的讲解深度学习(入门系列之五)
- 简单讲解Java设计模式编程中的单一职责原则