code: public synchronized CachingMultiIndexReader getIndexReader(final boolean initCache) throws IOException
     {
        return SecurityHelper.doPrivilegedIOExceptionAction(new PrivilegedExceptionAction<CachingMultiIndexReader>()
        {
           public CachingMultiIndexReader run() throws Exception
           {
              synchronized (updateMonitor)
              {
                 if (multiReader != null)
                 {
                    multiReader.acquire();
                    return multiReader;
                 }
                 // no reader available
                 // wait until no update is in progress
                 while (indexUpdateMonitor.getUpdateInProgress())
                 {
                    try
                    {
                       updateMonitor.wait();
                    }
                    catch (InterruptedException e)
                    {
                       throw new IOException("Interrupted while waiting to aquire reader");
                    }
                 }
                 // some other read thread might have created the reader in the
                 // meantime -> check again
                 if (multiReader == null)
                 {
                    ReadOnlyIndexReader[] readers = getReadOnlyIndexReaders(initCache, true);
                    multiReader = new CachingMultiIndexReader(readers, cache);
                 }
                 multiReader.acquire();
                 return multiReader;
              }
           }
        });
  
     }
docs: Returns an read-only <code>IndexReader</code> that spans alls indexes of
  this <code>MultiIndex</code>.
  
  @param initCache
  when set <code>true</code> the hierarchy cache is completely
  initialized before this call returns.
  @return an <code>IndexReader</code>.
  @throws IOException
  if an error occurs constructing the <code>IndexReader</code>.