【发布时间】:2013-11-19 22:06:18
【问题描述】:
我目前正在使用 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 文档中写道:
此方法返回的值只有在 在同一实例中获得的两个此类值之间的差异 Java 虚拟机的,被计算出来。
是否有可能由同一进程创建的线程在不同的 JVM 中执行?这可以解释nanoTime 的错误行为,但仍然没有太大意义。有什么想法吗?
【问题讨论】:
-
"同一进程创建的线程是否有可能在不同的 JVM 中执行?"除非您先明确创建一个单独的 jvm,否则不会。你上面的代码是在同一个线程中吗?
-
我明白了。没有
x = true是在与read x不同的线程中完成的 -
向我们展示更多您的代码。仅用两行代码很难找到潜在的同步错误。
-
@JBNizet 代码非常大,可以提出一个 SO 问题。我只是试图减少它......:s。所以你无法从我描述的行为中知道为什么会发生这种情况?
-
明确地说,x 被声明为 volatile?如果是这样,我敢打赌你还有其他同步问题。
标签: java multithreading concurrency milliseconds nanotime