注意:我不是在寻找解决方法;我确信如果有必要,我可以找到其他方法。我只是觉得我错过了一些基本或古怪的东西,我想知道我错过了什么。或者,如果有一种方法可以使用调试器来获取更多信息,那也很不错。谢谢!
我遇到使用synchronized的问题。我收到了僵局,但似乎完全不可能。我已经在每个同步调用之前放置了print语句,就在每个调用内部,并且在退出之前,所以我可以看到谁拥有哪个同步对象。我发现它不会进入我的同步调用之一,即使当前没有人持有该对象的锁定。是否存在某些我错过的怪癖或非法的嵌套操作?这是我正在做的事情的主旨。
哦,是的,最奇怪的是删除两个“busyFlagObject”同步使它工作正常......
主题1:
public void DrawFunction()
{
synchronized(drawObject)
{
...
// Hangs here though nobody has a lock on this object
synchronized(animationObject)
{
}
}
}
主题2:
public void AnotherFunction()
{
synchronized(busyFlagObject)
{
// Calls a function that also uses this same Synchronized call
synchronized(busyFlagObject)
{
// Calls another function that uses another Synchronized call
// Hangs here waiting for the draw function to complete which it SHOULD
// be able to do no problem.
synchronized(drawObject)
{
}
// Never gets to this one assuming the Log statements don't
// buffer and aren't flushed but still shouldn't be a problem anyway.
synchronized(animationObject)
{
}
}
}
}
答案 0 :(得分:2)
在调试器下运行您的应用程序或使用JDK工具中的“jstack”。这将直接向您显示哪些线程等待锁定以及哪些线程持有锁定,因此我们不必猜测您的问题所在: - )
那就是说,你提到你在布尔上同步。请记住,该类只有两个实例,许多东西(特别是装箱)会隐式地将您的布尔实例更改为“共享”值。你确定你的锁对象不是同一个实例吗?您可以考虑使用new Object()
作为监视对象。
值得注意的是,这个isn't the only place that this can happen并且在Java Concurrency in Practice中有一个很好的条目,特别是string interning,我目前无法找到链接。不要使用不受你控制的类型作为不打算做的事情: - )