Java 同步未进入
注意:我不是在寻找解决办法;如果必要的话,我肯定能找到其他方法。我只是觉得我错过了一些基本的或古怪的东西,我想知道我错过了什么。或者,如果有一种方法可以使用调试器获取更多信息,那也很好。谢谢 我在使用synchronized时遇到问题。我收到了僵局,但这似乎完全不可能。我在每个同步调用之前、每个调用内部以及退出之前都放置了print语句,这样我就可以看到谁都持有哪些同步对象。我发现它不会进入我的一个同步调用中,即使当前没有人持有该对象的锁。是否有一些我遗漏的怪癖或非法的筑巢操作?下面是我正在做的事情的简况 哦,是的,最奇怪的是,删除两个“busyFlagObject”同步使其工作正常 线程1:Java 同步未进入,java,android,synchronized,mutual-exclusion,Java,Android,Synchronized,Mutual Exclusion,注意:我不是在寻找解决办法;如果必要的话,我肯定能找到其他方法。我只是觉得我错过了一些基本的或古怪的东西,我想知道我错过了什么。或者,如果有一种方法可以使用调试器获取更多信息,那也很好。谢谢 我在使用synchronized时遇到问题。我收到了僵局,但这似乎完全不可能。我在每个同步调用之前、每个调用内部以及退出之前都放置了print语句,这样我就可以看到谁都持有哪些同步对象。我发现它不会进入我的一个同步调用中,即使当前没有人持有该对象的锁。是否有一些我遗漏的怪癖或非法的筑巢操作?下面是我正在做的
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”。这将直接向您显示哪些线程等待锁,哪些线程持有锁,因此我们不必猜测您的问题在哪里:-) 也就是说,您提到您在布尔值上进行同步。请记住,该类的目的是只有两个实例,并且许多事情(特别是装箱)会隐式地将布尔实例更改为“共享”值。是否确定锁定对象不是同一实例?您可以考虑使用<代码>新对象()/<代码>作为监视器对象。
值得注意的是,在Java并发的实践中,有一个很好的关于这个问题的条目,特别是关于,我目前没有找到一个链接。不要将不受您控制的类型用作它不打算执行的操作:-)如果删除嵌套的
busyFlagObject
syncronization中的一个,会发生什么情况?您确定问题出在同步块中,而不是从同步块中调用的函数中吗?您是否尝试删除除线程同步和日志之外的所有内容?仅删除一个busyFlagObject仍然会导致相同的死锁。我没有尝试删除函数中的代码,但它只与我所展示的一样深。所有未显示的内容都只是数学运算或变量设置。我知道它挂起了同步调用,因为调试器显示两个线程都卡住了。您确定busyFlagObject
和animationbject
不是同一个对象吗?(类似地,检查所有其他对象的组合,代码中的不同名称是否确实意味着不同的对象?)。我所有的同步对象都是布尔值,在声明时只设置了一次,以后再也不会更改。我确实使用了调试器,发现我的两个线程在哪里死锁了。一个在animationObject上死锁,另一个在drawObject上死锁。在animationObject上锁定的一个确实保留drawObject,但另一个不保留animationObject,因此不应出现死锁。如果有一种方法可以看到谁“持有锁”,那就太好了,但我不知道除了看到线程在哪里锁定之外还有什么方法。我不确定我是否完全理解你关于布尔的意思,但我将尝试使用新的Object(),看看它是否有所不同。谢谢哦我想我明白你现在的意思了。那么,“private Boolean bawb=true”与“private Boolean phred=true”是同一个实例,并且只有在其中一个为false时才会彼此不同,这是真的吗?这绝对是问题的原因@代码猴:是的,这正是问题所在:-)