code: public HashIndex<E> unmodifiableView() {
      HashIndex<E> newIndex = new HashIndex<E>() {
        @Override
        public void unlock() { throw new UnsupportedOperationException("This is an unmodifiable view!"); }
        private static final long serialVersionUID = 3415903369787491736L;
      };
      newIndex.objects = objects;
      newIndex.indexes = indexes;
      newIndex.lock();
      return newIndex;
    }
docs: Returns an unmodifiable view of the Index.  It is just
  a locked index that cannot be unlocked, so if you
  try to add something, nothing will happen (it won't throw
  an exception).  Trying to unlock it will throw an
  UnsupportedOperationException.  If the
  underlying Index is modified, the change will
  "write-through" to the view.
  
  @return An unmodifiable view of the Index