Index: src/java/org/apache/lucene/search/CachingSpanFilter.java =================================================================== --- src/java/org/apache/lucene/search/CachingSpanFilter.java (revision 832941) +++ src/java/org/apache/lucene/search/CachingSpanFilter.java (working copy) @@ -28,13 +28,15 @@ * filters to simply filter, and then wrap with this class to add caching. */ public class CachingSpanFilter extends SpanFilter { - protected SpanFilter filter; + private SpanFilter filter; /** - * A transient Filter cache. + * A transient Filter cache (package private because of test) */ - protected transient Map cache; + private transient Map cache; + private final Object lock = new Object(); + /** * @param filter Filter to cache results of */ @@ -49,19 +51,20 @@ } private SpanFilterResult getCachedResult(IndexReader reader) throws IOException { - SpanFilterResult result = null; - if (cache == null) { - cache = new WeakHashMap(); - } + synchronized(lock) { + SpanFilterResult result = null; + if (cache == null) { + cache = new WeakHashMap(); + } - synchronized (cache) { // check cache result = cache.get(reader); if (result == null) { result = filter.bitSpans(reader); cache.put(reader, result); } + + return result; } - return result; } Index: src/java/org/apache/lucene/search/CachingWrapperFilter.java =================================================================== --- src/java/org/apache/lucene/search/CachingWrapperFilter.java (revision 832941) +++ src/java/org/apache/lucene/search/CachingWrapperFilter.java (working copy) @@ -29,12 +29,14 @@ * filters to simply filter, and then wrap with this class to add caching. */ public class CachingWrapperFilter extends Filter { - protected Filter filter; + Filter filter; /** - * A transient Filter cache. + * A transient Filter cache (package private because of test) */ - protected transient Map cache; + transient Map cache; + + private final Object lock = new Object(); /** * @param filter Filter to cache results of @@ -63,28 +65,24 @@ @Override public DocIdSet getDocIdSet(IndexReader reader) throws IOException { - if (cache == null) { - cache = new WeakHashMap(); - } + synchronized(lock) { + if (cache == null) { + cache = new WeakHashMap(); + } - DocIdSet cached = null; - synchronized (cache) { // check cache - cached = cache.get(reader); - } + final DocIdSet cached = cache.get(reader); + if (cached != null) { + return cached; + } - if (cached != null) { - return cached; - } + final DocIdSet docIdSet = docIdSetToCache(filter.getDocIdSet(reader), reader); - final DocIdSet docIdSet = docIdSetToCache(filter.getDocIdSet(reader), reader); - - if (docIdSet != null) { - synchronized (cache) { // update cache + if (docIdSet != null) { cache.put(reader, docIdSet); } + + return docIdSet; } - - return docIdSet; } @Override