这个问题是
this question年描述(并解决)问题的一个更特殊的例子。
我有两个方法,stopAndRemove(ServerObject服务器)和一个close()方法。稍后应关闭所有服务器并将其从服务器列表中删除。列表定义为
List server.
我不想在closeCurrentlyOpen中的stopAndRemove几乎有相同的代码,所以我想做一些类似于
public void closeCurrentlyOpen() {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
这将不起作用,因为这将导致ConcurrentModificationException。我试图复制一份清单
List copyList = new ArrayList(this.servers);
并将其用作foreach循环的列表。但是,当我正在迭代copyList但是closeCurrentlyOpen应该导致一个emtpy列表时,其他线程可能会将一个服务器附加到服务器列表。
由于addServerToList方法与servers-list同步,所以这样做
public void closeCurrentlyOpen() {
synchronized(this.servers) {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
}
将解决修改的问题。但是,如果直接调用stopAndRemove方法,则无法同步代码。
在我看来,这三种方法的设计可能需要修复。
有想法吗