注意:我不是在寻找解决方法;如有必要,我相信我可以找到其他方法。我只是觉得我错过了一些基本的或古怪的东西,我想知道我错过了什么。或者,如果有一种方法可以使用调试器获取更多信息,那也很好。谢谢!
我在使用同步时遇到问题。我遇到了僵局,但这似乎完全不可能。我在每次同步调用之前、每次调用内部和退出之前都放置了 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)
{
}
}
}
}
最佳答案
在调试器下运行您的应用程序或使用 JDK 工具中的“jstack”。这将直接向您显示哪些线程等待锁,哪些线程持有锁,因此我们不必猜测您的问题出在哪里:-)
就是说,您提到您在 boolean 值上同步。请记住,该类旨在只有两个实例,许多事情(尤其是装箱)会隐式地将您的 boolean 实例更改为“共享”值。你确定你的锁对象不是同一个实例吗?您可能会考虑使用 new Object()
作为您的监视器对象。
值得注意的是这个 isn't the only place that this can happen在 Java Concurrency in Practice 中有一个关于这个问题的很好的条目,特别是 string interning ,我目前找不到链接。不要将不受您控制的类型用作它不打算做的事情:-)
关于java - 同步未进入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14226136/