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)
"获得新人"是指你创建一个新的名册对象?
你确定你正确同步吗?同步发生在实例上,而不是变量上.所以,如果你这样做
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)
同步不会发生在变量名称上,而是发生在内容上.如果覆盖内容,则不会重新同步到新值!
归档时间: |
|
查看次数: |
29613 次 |
最近记录: |