java - 同步未进入

标签 java android synchronized mutual-exclusion

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

我在使用同步时遇到问题。我遇到了僵局,但这似乎完全不可能。我在每次同步调用之前、每次调用内部和退出之前都放置了 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/

相关文章:

java - 如何根据传递的类型调用枚举方法?

android - 如何检查页脚是否已添加到 ListView ?

java - 使用 JSoup 转到 aspx 表单上的下一页

java - Android 点击按钮不改变背景颜色

java - main 方法中的同步块(synchronized block)

java - 如何检查一个点是否在多边形内

java - org.postgresql.util.PSQLException : ERROR: syntax error at or near "("

java - 同步(this)和同步(Thread.currentThread())之间的区别

java - 使用 Jenkins 发送电子邮件收到以下错误响应

java - 多线程