Index: src/java/org/apache/lucene/search/FieldCacheImpl.java =================================================================== --- src/java/org/apache/lucene/search/FieldCacheImpl.java (revision 912317) +++ src/java/org/apache/lucene/search/FieldCacheImpl.java (working copy) @@ -58,27 +58,25 @@ caches.put(StringIndex.class, new StringIndexCache(this)); } - public void purgeAllCaches() { + public synchronized void purgeAllCaches() { init(); } - public void purge(IndexReader r) { + public synchronized void purge(IndexReader r) { for(Cache c : caches.values()) { c.purge(r); } } - public CacheEntry[] getCacheEntries() { + public synchronized CacheEntry[] getCacheEntries() { List result = new ArrayList(17); - for(final Class cacheType: caches.keySet()) { - Cache cache = caches.get(cacheType); - for (final Object readerKey : cache.readerCache.keySet()) { - // we've now materialized a hard ref - - // innerKeys was backed by WeakHashMap, sanity check - // that it wasn't GCed before we made hard ref - if (null != readerKey && cache.readerCache.containsKey(readerKey)) { - Map innerCache = cache.readerCache.get(readerKey); + for(final Map.Entry,Cache> cacheEntry: caches.entrySet()) { + final Cache cache = cacheEntry.getValue(); + final Class cacheType = cacheEntry.getKey(); + synchronized(cache.readerCache) { + for (final Map.Entry> readerCacheEntry : cache.readerCache.entrySet()) { + final Object readerKey = readerCacheEntry.getKey(); + final Map innerCache = readerCacheEntry.getValue(); for (final Map.Entry mapEntry : innerCache.entrySet()) { Entry entry = mapEntry.getKey(); result.add(new CacheEntryImpl(readerKey, entry.field,