Version 2 had snapshot iterators, used for two purposes: a) allowing underlying index modifications while iterating (over the snapshot). Note that this includes even simple things like changing begin/end values in an annotation (which could cause a remove/add-back to indexes action while those features are changed).
b) performance (in some edge cases, but also has a performance cost initially (to create the snapshot)) It might be reasonable to support case (a) more automatically. One approach might be to do a "copy on write" style for the index parts. Java has, for instance CopyOnWriteArrayList and CopyOnWriteArraySet. This could add 1 more level of indirection in using UIMA indexes; details need to be worked out and could be complex (indexes need to be performant and thread-safe for reading). Does this seem like a good thing to try? -Marshall