我有一组具有方法的connection
对象(我无法更改的库代码)send
。如果发送失败,他们会回调onClosed
我在代码中实现的通用侦听器removeConnection()
,这将从集合中删除连接。
回调是通用的onClosed
,可以随时调用。例如,在对等方关闭连接时调用它,而不仅仅是在写入失败时调用。
但是,如果我有一些代码在我的连接上循环并发送,那么onClosed
回调将尝试在迭代期间修改集合。
我当前的代码在每次迭代之前创建连接列表的副本;然而,在分析中,这已被证明是非常昂贵的。
Set<Connection> connections = new ....;
public void addConnection(Connection conn) {
connections.add(conn);
conn.addClosedListener(this);
}
@Override void onClosed(Connection conn) {
connections.remove(conn);
}
void send(Message msg) {
// how to make this so that the onClosed callback can be safely invoked, and efficient?
for(Connection conn: connections)
conn.send(msg);
}
如何在迭代期间有效地处理修改集合?