Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步未进入_Java_Android_Synchronized_Mutual Exclusion - Fatal编程技术网

Java 同步未进入

Java 同步未进入,java,android,synchronized,mutual-exclusion,Java,Android,Synchronized,Mutual Exclusion,注意:我不是在寻找解决办法;如果必要的话,我肯定能找到其他方法。我只是觉得我错过了一些基本的或古怪的东西,我想知道我错过了什么。或者,如果有一种方法可以使用调试器获取更多信息,那也很好。谢谢 我在使用synchronized时遇到问题。我收到了僵局,但这似乎完全不可能。我在每个同步调用之前、每个调用内部以及退出之前都放置了print语句,这样我就可以看到谁都持有哪些同步对象。我发现它不会进入我的一个同步调用中,即使当前没有人持有该对象的锁。是否有一些我遗漏的怪癖或非法的筑巢操作?下面是我正在做的

注意:我不是在寻找解决办法;如果必要的话,我肯定能找到其他方法。我只是觉得我错过了一些基本的或古怪的东西,我想知道我错过了什么。或者,如果有一种方法可以使用调试器获取更多信息,那也很好。谢谢

我在使用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)
            {

            }
        }
    }
}

在调试器下运行应用程序或使用JDK工具中的“jstack”。这将直接向您显示哪些线程等待锁,哪些线程持有锁,因此我们不必猜测您的问题在哪里:-)

也就是说,您提到您在布尔值上进行同步。请记住,该类的目的是只有两个实例,并且许多事情(特别是装箱)会隐式地将布尔实例更改为“共享”值。是否确定锁定对象不是同一实例?您可以考虑使用<代码>新对象()/<代码>作为监视器对象。


值得注意的是,在Java并发的实践中,有一个很好的关于这个问题的条目,特别是关于,我目前没有找到一个链接。不要将不受您控制的类型用作它不打算执行的操作:-)

如果删除嵌套的
busyFlagObject
syncronization中的一个,会发生什么情况?您确定问题出在同步块中,而不是从同步块中调用的函数中吗?您是否尝试删除除线程同步和日志之外的所有内容?仅删除一个busyFlagObject仍然会导致相同的死锁。我没有尝试删除函数中的代码,但它只与我所展示的一样深。所有未显示的内容都只是数学运算或变量设置。我知道它挂起了同步调用,因为调试器显示两个线程都卡住了。您确定
busyFlagObject
animationbject
不是同一个对象吗?(类似地,检查所有其他对象的组合,代码中的不同名称是否确实意味着不同的对象?)。我所有的同步对象都是布尔值,在声明时只设置了一次,以后再也不会更改。我确实使用了调试器,发现我的两个线程在哪里死锁了。一个在animationObject上死锁,另一个在drawObject上死锁。在animationObject上锁定的一个确实保留drawObject,但另一个不保留animationObject,因此不应出现死锁。如果有一种方法可以看到谁“持有锁”,那就太好了,但我不知道除了看到线程在哪里锁定之外还有什么方法。我不确定我是否完全理解你关于布尔的意思,但我将尝试使用新的Object(),看看它是否有所不同。谢谢哦我想我明白你现在的意思了。那么,“private Boolean bawb=true”与“private Boolean phred=true”是同一个实例,并且只有在其中一个为false时才会彼此不同,这是真的吗?这绝对是问题的原因@代码猴:是的,这正是问题所在:-)