6

しかし、私は「名簿」オブジェクトが新しくなるたびに同期しています。どうして ?

問題のコード:

 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;
}
4

1 に答える 1

8

「gets new'ed」とは、新しい名簿オブジェクトを作成することを意味しますか?

正しく同期していますか? 同期は、変数ではなくインスタンスで行われます。したがって、たとえば

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

次に、新しいではなく、古いにのみ同期します。 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!
}

同期は変数の名前ではなく、内容で行われます。内容を上書きすると、新しい値に再同期されません!

于 2012-05-16T16:52:08.167 に答える