Index: lucene/src/java/org/apache/lucene/index/IndexReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/IndexReader.java (revision 1220751) +++ lucene/src/java/org/apache/lucene/index/IndexReader.java (working copy) @@ -22,10 +22,11 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import org.apache.lucene.document.Document; @@ -36,7 +37,6 @@ import org.apache.lucene.util.Bits; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.CommandLineUtil; -import org.apache.lucene.util.MapBackedSet; import org.apache.lucene.util.ReaderUtil; // for javadocs /** IndexReader is an abstract class, providing an interface for accessing an @@ -84,7 +84,7 @@ } private final Set readerClosedListeners = - new MapBackedSet(new ConcurrentHashMap()); + Collections.synchronizedSet(new LinkedHashSet()); /** Expert: adds a {@link ReaderClosedListener}. The * provided listener will be invoked when this reader is closed. @@ -104,8 +104,10 @@ } private final void notifyReaderClosedListeners() { - for(ReaderClosedListener listener : readerClosedListeners) { - listener.onClose(this); + synchronized(readerClosedListeners) { + for(ReaderClosedListener listener : readerClosedListeners) { + listener.onClose(this); + } } } Index: lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java =================================================================== --- lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java (revision 1220751) +++ lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java (working copy) @@ -18,8 +18,9 @@ */ import java.io.IOException; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import org.apache.lucene.codecs.Codec; @@ -34,7 +35,6 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; import org.apache.lucene.util.IOUtils; -import org.apache.lucene.util.MapBackedSet; /** Holds core readers that are shared (unchanged) when * SegmentReader is cloned or reopened */ @@ -68,7 +68,7 @@ CompoundFileDirectory storeCFSReader; final Set coreClosedListeners = - new MapBackedSet(new ConcurrentHashMap()); + Collections.synchronizedSet(new LinkedHashSet()); SegmentCoreReaders(SegmentReader owner, Directory dir, SegmentInfo si, IOContext context, int termsIndexDivisor) throws IOException { @@ -138,8 +138,10 @@ if (ref.decrementAndGet() == 0) { IOUtils.close(fields, perDocProducer, termVectorsReaderOrig, fieldsReaderOrig, cfsReader, storeCFSReader, norms); - for (CoreClosedListener listener : coreClosedListeners) { - listener.onClose(owner); + synchronized(coreClosedListeners) { + for (CoreClosedListener listener : coreClosedListeners) { + listener.onClose(owner); + } } } }