首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java nanoTime进行多线程

用Java nanoTime进行多线程
EN

Stack Overflow用户
提问于 2013-11-19 22:06:18
回答 2查看 1.2K关注 0票数 1

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

代码语言:javascript
复制
// 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文档中,它是这样写的:

只有在计算在Java虚拟机的同一实例中获得的两个此类值之间的差异时,此方法返回的值才具有意义。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-19 22:17:13

这完全取决于操作系统,但如果您有一个CPU套接字,您将很难看到使用nanoTime的任何错误。如果您使用Wiindow 7+或最近版本的Linux,nanoTime会纠正套接字之间的差异。顺便说一句,如果您有一个多套接字XP框,您可以看到nanoTime来回跳几毫秒。(总之,不要在多套接字计算机上使用XP,并期望得到好的结果)

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

同一进程创建的线程是否有可能在不同的JVM中执行?

我不知道有什么办法可以做到这一点,我也想不出有什么原因会影响到这件事。无论您使用的是哪个线程、JVM还是进程,都会执行相同的系统调用。

这可以解释nanoTime的错误行为,但它仍然没有太多意义。有什么想法吗?

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

读x //读错误,而阅读前的时间是0001

如果您的时间比微秒更好,那么对nanoTime()的每次调用都可能是不同的。通过缓存对易失性变量的更新至少需要75个时钟周期或20纳秒。没有什么是即时的,而且我看到线程之间延迟的延迟接近100纳米秒,而线程之间的简单更新则是线程间的延迟。

票数 3
EN

Stack Overflow用户

发布于 2013-11-19 22:38:25

我不知道期望nanoTime允许您以这种方式命令发生在不同线程上的事件是有效的。我会重新考虑您的设计,每个线程都有一个独立的日志文件,您可以根据时间合并到一起。如果您使用的是log4j,我只会让它们写入相同的日志。

如果您正在构建您自己的日志实现,我将让它们将它们的消息写入java.util.concurrent.LinkedBlockingQueue (不会出现争用,我怀疑这正是您通过让每个线程都有自己的日志来避免的),并有另一个线程负责定期删除队列中的任何可用消息并将它们写入文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20083072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档