java.lang.IllegalMonitorStateException:对象在wait()之前未被线程锁定

kel*_*ogs 6 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;
}
Run Code Online (Sandbox Code Playgroud)

Ano*_*sse 8

"获得新人"是指你创建一个新的名册对象?

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

synchronized(roster) {
  roster = new Roster();
  // do something
}
Run Code Online (Sandbox Code Playgroud)

然后你只同步到旧的,而不是新的 roster.

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

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!
}
Run Code Online (Sandbox Code Playgroud)

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