Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.IllegalMonitorStateException:对象在等待()之前未被线程锁定_Java_Android_Synchronize_Locks - Fatal编程技术网

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

java.lang.IllegalMonitorStateException:对象在等待()之前未被线程锁定,java,android,synchronize,locks,Java,Android,Synchronize,Locks,但我在“花名册”对象上同步,无论它在哪里更新。为什么 违规代码: public Roster getRoster() { if (roster == null) { return null; } if (!roster.rosterInitialized) { try { synchronized (roster) { roster.reload();

但我在“花名册”对象上同步,无论它在哪里更新。为什么

违规代码:

 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;
}
公共花名册get花名册(){
如果(花名册==null){
返回null;
}
如果(!花名册已初始化){
试一试{
已同步(名册){
花名册。重新加载();
long waitTime=SmackConfiguration.getPacketReplyTimeout();
长启动=System.currentTimeMillis();
而(!花名册.花名册初始化){
如果(waitTime带有“getnew'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!
}

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

在何处调用Notify?虽然您在观察中是正确的,但我看不出这可能是异常的原因。您能详细说明吗?选项#1将是If-Floster.reload()可能会以某种方式更改花名册变量所引用的对象。选项2是,在进行wait()调用之前或在调用过程中,其他线程会更改花名册变量所引用的对象。在这两种情况下,同步花名册的花名册将与正在等待()的花名册不同。