java.lang.IllegalMonitorStateException : object not locked by thread before wait() 异常

标签 java android synchronize locks

但是我在“花名册”对象被更新的任何地方进行同步。怎么会?

违规代码:

 public Roster getRoster() {
    if (roster == null) {
        return null;
    }

    if (!roster.rosterInitialized) {
        try {
            synchronized (roster) {
                roster.reload();
                long waitTime = SmackConfiguration.getPacketReplyTimeout();
                long start = System.currentTimeMillis();
                while (!roster.rosterInitialized) {
                    if (waitTime <= 0) {
                        break;
                    }
                    roster.wait(waitTime);
                    long now = System.currentTimeMillis();
                    waitTime -= now - start;
                    start = now;
                }
            }
        }
        catch (InterruptedException ie) {
            // Ignore.
        }
    }
    return roster;
}

最佳答案

“gets new'ed”是指创建一个名册对象?

您确定同步正确吗?同步发生在实例,而不是变量。所以如果你这样做,例如

synchronized(roster) {
  roster = new Roster();
  // do something
}

然后您只同步到,而不是 花名册

所以下面的代码应该会产生同样的错误:

Roster roster = new Roster();
Roster othervariable = roster;
synchronized(othervariable) {
  roster = new Roster(); // create a new roster
  othervariable.wait(1000); // OK, since synchronized with this instance!
  roster.wait(1000); // NOT OK, not synchronized with *new* roster!
}

同步不会发生在变量名称上,而是发生在内容上。如果覆盖内容,则不会重新同步到新值!

关于java.lang.IllegalMonitorStateException : object not locked by thread before wait() 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622500/

相关文章:

java - pom 编辑器中的 Eclipse Maven 错误 : org. apache.maven.plugin.jar.JarMojo 错误

java - 什么是理想的调试设置?窗口放置等

android - 陀螺仪没有任何漂移

multithreading - 将参数传递给同步过程调用

eclipse - 遇到同步问题 - eclipse 中的 Sonar 集成错误

javascript - 同一页面上的多个滚动条

java - 如何获取已在 Java Servlet 上下文中设置的全局对象

java - Quarkus 应用程序在 Heroku 上的部署问题

java - SCORM 包下载供离线查看

android - 在 Android 中获取像素颜色