gpt4 book ai didi

java - 在64位JVM上是双原子的读写吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:21:02 25 4
gpt4 key购买 nike

我正在对 Java 代码的正确同步进行一些研究,并且遇到了多个声明 double 和长整型的读/写不是原子的实例。

所以我写了一个简单的基准测试,发现 double 通常更快(快了一点),我唯一一次注意到很大的差异是当我在代码中出现错误并且我在 double 和 float 之间来回转换(保留为第三个测试用例)时。一旦数学是纯 double 或纯浮点,基准几乎完全相同。 (Java 1.8,64 位 Oracle JVM)

但是,我了解到 double 和长读取和写入不是原子的,而是被 JVM 视为 2 个 32 位读取和写入。

难道我不应该期待性能差异吗?

public class Benchmark
{
static double loopDouble (double aAddValue)
{
double tResult = 0.0;
while (tResult < 10000000.0)
{
tResult += aAddValue;
}

return tResult;
}

static double loopFloat (float aAddValue)
{
double tResult = 0.0;
while (tResult < 10000000.0)
{
tResult += aAddValue;
}

return tResult;
}

static float loopFloatFloat (float aAddValue)
{
float tResult = 0.0f;
while (tResult < 10000000.0f)
{
tResult += aAddValue;
}

return tResult;
}

static double loopInt (int aAddValue)
{
double tResult = 0.0;
while (tResult < 10000000.0)
{
tResult += aAddValue;
}

return tResult;
}

public static void main(String[] args)
{

long doubleTimeNs = - System.nanoTime();
loopDouble(1.0);
doubleTimeNs += System.nanoTime();

long floatTimeNs = - System.nanoTime();
loopFloat(1.0f);
floatTimeNs += System.nanoTime();

long floatfloatTimeNs = - System.nanoTime();
loopFloatFloat(1.0f);
floatfloatTimeNs += System.nanoTime();

long intTimeNs = -System.nanoTime();
loopInt(1);
intTimeNs += System.nanoTime();

long doubleTime2Ns = - System.nanoTime();
loopDouble(1.0);
doubleTime2Ns += System.nanoTime();

System.out.println("Double: " + doubleTimeNs + " (" + doubleTime2Ns + ") "+ " Float: " + floatTimeNs + " Float-float: " + floatfloatTimeNs + " Int: " + intTimeNs);
}
}



Double: 23944257 (23736683) Float: 24220307 Float-float: 24134056 Int: 25745599

最佳答案

凯利·丹尼 (Kelly Denehy) 指出。 JLS section 17.7

“出于 Java 编程语言内存模型的目的,对非 volatile long 或 double 值的单次写入被视为两次单独的写入:每个 32 位一半写入一次。这可能会导致线程看到一次写入中的 64 位值的前 32 位,以及另一次写入中的第二个 32 位。

volatile 长整型和 double 值的写入和读取始终是原子的。

引用的写入和读取始终是原子的,无论它们是实现为 32 位还是 64 位值。 ”

关于java - 在64位JVM上是双原子的读写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58308590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com