gpt4 book ai didi

java - Java nanoTime 的多线程

转载 作者:行者123 更新时间:2023-12-01 23:25:26 35 4
gpt4 key购买 nike

我目前正在使用 Java 编写多线程程序。在某些时候,不同的线程会记录它们的操作,我正在使用 nanoTime为了这。每个线程都有自己的日志文件,最后我将它们合并并根据时间 (nanoTime) 对它们进行排序,以查看发生了什么。问题是我有与此类似的错误行为,其中 x 是一个 volatile 变量:

// logged by thead1
x = true // done at time 0000, time computed & logged after x = true was done

// no events in between

// logged by thread2
read x // reads false while time before reading is 0001

所以在我看来,nanoTime 并没有真正正确地计时。在 nanoTime 文档中写道:

The values returned by this method become meaningful only when the difference between two such values, obtained within the same instance of a Java virtual machine, is computed.

同一个进程创建的线程是否有可能在不同的 JVM 中执行?这可以解释 nanoTime 的错误行为,但仍然没有多大意义。有什么想法吗?

最佳答案

这完全取决于操作系统,但如果您有一个 CPU 插槽,则使用 nanoTime 时将很难看到任何错误。如果您使用 Wiindows 7+ 或最新版本的 Linux,nanoTime 会纠正套接字之间的差异。顺便说一句,如果您有一个多插槽 XP 盒子,您可以看到 nanoTime 向后和向前跳跃几毫秒。 (简而言之,不要在多插槽计算机上使用 XP 并期望得到好的结果)

另请注意,某些操作系统仅具有微秒分辨率。这意味着您可以在线程之间执行许多操作,并且它们都具有相同的时间戳。解决方案是使用具有更高分辨率计时器的操作系统。这不涉及更改您的代码甚至 JVM。

Is it perhaps possible for threads created by the same process to be executed in different JVMs?

我不知道有什么方法可以做到这一点,我也想不出这很重要的原因。无论您使用哪个线程、JVM 或进程,都会进行相同的系统调用。

This would explain the erroneous behaviour of nanoTime but still it doesn't make too much sense. Any ideas?

很可能您的操作系统上的 nanoTime() 调用只有微秒分辨率。

read x // reads false while time before reading is 0001

如果您的计时精度高于微秒,则每次调用 nanoTime() 都可能不同。通过缓存更新 volatile 变量至少需要 75 个时钟周期或约 20 纳秒。没有什么是即时的,我已经看到线程之间的延迟接近 100 纳秒,线程之间的琐碎更新。

关于java - Java nanoTime 的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20083072/

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