java - 我知道happens-before并不意味着发生在之前,代码“A = B + 1; B = 1;”可以吗?产生结果“A == 2 and B == 1”?
问题描述
在这篇文章中,作者提到“Happens-Before 并不意味着 Happening Before”,并举例说明。
int A = 0;
int B = 0;
void foo()
{
A = B + 1; // (1)
B = 1; // (2)
}
他说(2)实际上可以在(1)之前发生,我的问题是如果(2)实际上发生在(1)、1或2之前,A的值是多少?
解决方案
A
并且B
是内存中的位置。但是,该操作B+1
不会发生在内存中,而是发生在 CPU 中。具体来说,作者是在描述这两个操作。
A = B + 1
(1)
- A1 - 内存位置
B
(0
) 中的值被加载到 CPU 寄存器中 - A2 - CPU 寄存器递增
1
- A3 - CPU 寄存器 (
1
) 中的值被写入内存位置A
B = 1
(2)
- B1 - 将值
1
写入内存位置B
Happens-Before要求B
(步骤 A1)的读取发生在B
(步骤 B1)的写入之前。但是,其余操作没有相互依赖关系,可以在不影响结果的情况下重新排序。这些序列中的任何一个都会产生相同的结果
- A1、B1、A2、A3
- A1、A2、B1、A3
- A1、A2、A3、B1
推荐阅读
- vb6 - 在我的 VB6 IDE 中设置 ImageMagick 时遇到问题
- java - 如何在 Java Spark 的列中按唯一名称排序?
- c++ - c++中降序排序是如何工作的?
- html - CSS(引导程序):未突出显示活动/当前选项卡式菜单项
- android - Kotlin /Android Studio 错误:必需可编辑!找到字符串?
- c# - HTML 标记中的 XPath 选择属性
- r - 使用 googleway 使用经纬度坐标进行反向地理编码循环的问题:r 对不同坐标给出相同的结果
- mysql - 在 MySQL/SQL 中按频率排序
- maven - maven JAR 可以在 hadoop 上运行吗?
- vba - 使用Word VBA,我可以将一个Form的代码模块分成两个代码模块吗?