code: protected <E> E read(Supplier<E> sup) {
          try {
              this.lock.readLock().lock();
              return sup.get();
          } finally {
              this.lock.readLock().unlock();
          }
      }
docs: Executes the given supplier within the context of a read lock.
  
  @param <E> The result type.
  @param sup The supplier.
  @return The result of {@link Supplier#get()}.