code: private void readCache()
          throws CacheReloadException
      {
          // if cache is not initialized, the correct order is required!
          // otherwise the cache is not null and returns wrong values!
          final Map<Long, T> newCache4Id = getNewCache4Id();
          final Map<String, T> newCache4Name = getNewCache4Name();
          final Map<UUID, T>  newCache4UUID = getNewCache4UUID();
          try {
              readCache(newCache4Id, newCache4Name, newCache4UUID);
          } catch (final CacheReloadException e) {
              AbstractCache.LOG.error("Read Cache for " + getClass() + " failed", e);
              throw e;
              //CHECKSTYLE:OFF
          } catch (final Exception e) {
              //CHECKSTYLE:ON
              AbstractCache.LOG.error("Unexpected error while reading Cache for " + getClass(), e);
              throw new CacheReloadException("Unexpected error while reading Cache " + "for " + getClass(), e);
          }
          // replace old cache with new values
          // it is thread save because of volatile
          this.cache4Id = newCache4Id;
          this.cache4Name = newCache4Name;
          this.cache4UUID = newCache4UUID;
      }
docs: The complete cache is read and then replaces the current stored values
  in the cache. The cache must be read in this order:
  <ul>
  <li>create new cache map</li>
  <li>read cache in the new cache map</li>
  <li>replace old cache map with the new cache map</li>
  </ul>
  This order is imported, otherwise
  <ul>
  <li>if the cache initialized first time, the cache is not
  <code>null</code> and returns then wrong values</li>
  <li>existing and read values could not be read while a reload is
  done</li>
  </ul>
  
  @throws CacheReloadException if the cache could not be read (the
  exception is also written into the error
  log)