Index: lucene/core/src/java/org/apache/lucene/index/IndexReader.java =================================================================== --- lucene/core/src/java/org/apache/lucene/index/IndexReader.java (revision 1548710) +++ lucene/core/src/java/org/apache/lucene/index/IndexReader.java (working copy) @@ -168,8 +168,9 @@ * @see #tryIncRef */ public final void incRef() { - ensureOpen(); - refCount.incrementAndGet(); + if (!tryIncRef()) { + ensureOpen(); + } } /** Index: lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java =================================================================== --- lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java (revision 1548710) +++ lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java (working copy) @@ -32,6 +32,7 @@ import org.apache.lucene.codecs.StoredFieldsReader; import org.apache.lucene.codecs.TermVectorsReader; import org.apache.lucene.index.SegmentReader.CoreClosedListener; +import org.apache.lucene.store.AlreadyClosedException; import org.apache.lucene.store.CompoundFileDirectory; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; @@ -139,7 +140,13 @@ } void incRef() { - ref.incrementAndGet(); + int count; + while ((count = ref.get()) > 0) { + if (ref.compareAndSet(count, count+1)) { + return; + } + } + throw new AlreadyClosedException("SegmentCoreReaders is already closed"); } NumericDocValues getNormValues(FieldInfo fi) throws IOException {