public synchronized void updateAll() { HashSet<UpdatableNode> seenNodes = new HashSet<UpdatableNode>(); // make a copy of _all, since UpdatableNode.update can add to it for (UpdatableNode node : new ArrayList<UpdatableNode>(_all)) { node.update(seenNodes); } if (seenNodes.size() > 0) { // not empty, means that at least 1 server gave node list // remove unused hosts Iterator<UpdatableNode> it = _all.iterator(); while (it.hasNext()) { if (!seenNodes.contains(it.next())) it.remove(); } } }