// synchronized
sclass MoreEfficientCopyOnWriteList extends NotifyingList {
bool hasIterator;
*() {}
*(L list) { super(list); }
public synchronized Iterator iterator() {
set hasIterator;
ret super.iterator();
}
public synchronized Spliterator spliterator() {
set hasIterator;
ret super.iterator();
}
public synchronized ListIterator listIterator() {
set hasIterator;
ret super.listIterator();
}
public synchronized ListIterator listIterator(int index) {
set hasIterator;
ret super.listIterator(index);
}
@Override
// This is called in synchronized block
void beforeChange {
if (hasIterator) {
list = cloneList(list);
hasIterator = false;
}
}
void change {}
}