当前位置: 首页 > 知识库问答 >
问题:

Java内存模型-令人惊讶的行为

子车征
2023-03-14

谁能解释一下吗?

共有1个答案

秦宏硕
2023-03-14

8.1记忆模型允许的令人惊讶的行为

图12显示了一个小而有趣的示例。行为r1==2和r2==1是一种合法行为,尽管很难看出它是如何发生的。编译器不会对每个线程中的语句重新排序;此代码绝不能导致r1==1或r2==2。然而,行为r1==2和r2==1可能被提前执行写操作的处理器体系结构所允许,但它们对于按照程序顺序出现在它们之前的本地读操作是不可见的。这种行为虽然令人惊讶,但却是Java内存模型所允许的。为了在内存模型中得到这个结果,我们先提交两次写,然后再提交两次读。

CPU决定在读取X之前写入X。这个例子所说的是,这是有效的行为,或多或少,这是一个被接受为有效行为的例外。

//Thread 1
int x = 0;
int r1 = x;
x = 1;

//Thread 2
int x = 0;
int r2 = x;
x = 2;
//Thread 1
int x = 0;
x = 1;
int r1 = x;

//Thread 2
int x = 0;
x = 2;
int r2 = x;
 类似资料:
  • 问题内容: 在我的应用程序中,我遇到了以下问题,并对结果感到惊讶: (两个整数)。 这是什么意思? 问题答案: 对于实际值,即结果为。 您使用整数除法得到的结果将向下舍入为的更负值。(也称为“地板部门”) 这就是为什么您会得到以下令人困惑的答案的原因: 注: 这是在Python 3中,其中的结果,“固定”是。因此,如果您没有理由使用Python 2,则应该升级。;) 在Python 3中,如果仍然

  • 问题内容: 我在timeit上获得了非常令人惊讶的结果,有人可以告诉我我做错了什么吗?我正在使用Python 2.7。 这是文件speedtest_init.py的内容: 这些是speedtest.py的内容: 控制台输出为: 我认为默认情况下timeit()运行代码的1000000倍,因此我需要将时间除以1000000,但是令人惊讶的是Counter的速度比defaultdict()慢。 那是预

  • 我有一个关于小数的整数的有趣问题。

  • 这是一个来自第三方库API的真实示例,但经过了简化。 用Oracle JDK 8U72编译 考虑以下两种方法: 两者都报告了一个“未经检查的强制转换”警告--我知道原因了。让我困惑的是为什么我可以打电话 试图传递会出现错误,正如所料: 如果报告为错误,为什么不是?

  • 问题内容: 我试图弄清楚如何正确使用Java的执行器。我意识到向提交任务有其自身的开销。但是,我惊讶地发现它是如此之高。 我的程序需要以尽可能低的延迟处理大量数据(股市数据)。大多数计算是相当简单的算术运算。 我想测试的东西很简单:“ ” 最简单的测试在一个简单的循环中运行此计算。第二个测试在匿名Runnable内部执行相同的计算(这应该用来衡量创建新对象的成本)。第三次测试将传递给。(这用于衡量