同步未进入

时间:2013-01-08 23:54:32

标签: java android synchronized mutual-exclusion

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

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

            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

那就是说,你提到你在布尔上同步。请记住,该类只有两个实例,许多东西(特别是装箱)会隐式地将您的布尔实例更改为“共享”值。你确定你的锁对象不是同一个实例吗?您可以考虑使用new Object()作为监视对象。

值得注意的是,这个isn't the only place that this can happen并且在Java Concurrency in Practice中有一个很好的条目,特别是string interning,我目前无法找到链接。不要使用不受你控制的类型作为不打算做的事情: - )