【发布时间】:2015-05-03 03:22:15
【问题描述】:
我是 java 多线程的新手,我有一个问题可能有些琐碎。
我必须调试第三方代码,我需要一些基本信息,以便知道在哪里寻找问题,因为代码非常大。
当以下代码运行时:
public void method()
{
long startTime = System.currentTimeMillis();
synchronized (obj)
{
log( "time:" + System.currentTimeMillis() - startTime + " ms" );
...
}
}
我明白了:
11:13:12 - time: 3816 ms
...
11:14:14 - time: 0 ms
为什么要花这么长时间(3816 毫秒)来获取对象的锁? 我应该去哪里看?例如,我想一个可能的答案是寻找获取“obj”锁定的代码,即块,例如:
synchronized (obj) { ... }
或者是否有可能在没有“同步”的情况下对对象“obj”进行任何修改也可以锁定该对象?
【问题讨论】:
-
这是你得到的第一个日志吗?
-
@CommuSoft 是的,这是我得到的第一个日志
-
@fge 对象是一个复杂对象。它用于许多不同的类并做许多不同的事情。你能解释一下你为什么问这个问题,以便我给你一个准确的答案吗?
-
@CommuSoft 如果这是 Oracle 的 JVM 并因此是 HotSpot,优化仅在 10k 执行 AFAIK 后才开始触发;因此,我怀疑 JIT 是这里的答案
-
你在浴室锁着的门外等着。 那里需要这么长时间? 这个问题的答案与门锁的质量完全无关,而与房间里的人有关。请记住,使用锁的建议是:(1)不要花任何时间在锁上,以避免争用;(2)尽可能少的锁,以避免死锁错误。聪明的读者会注意到,这两个很好的建议实际上是相反,这会在尝试遵循它时产生问题。有趣的游戏,并发;获胜的唯一方法就是不玩。
标签: java android multithreading synchronized