code: @Override
      public T get(final long timeout, final TimeUnit timeUnit) {
          if (closed) {
              throw new IllegalStateException("The pool is closed");
          }
  
          if (!acquirePermit(timeout, timeUnit)) {
              throw new MongoTimeoutException(String.format("Timeout waiting for a pooled item after %d %s", timeout, timeUnit));
          }
  
          T t = available.pollLast();
          if (t == null) {
              t = createNewAndReleasePermitIfFailure(false);
          }
  
          return t;
      }
docs: Gets an object from the pool - will block if none are available
  
  @param timeout  negative - forever 0        - return immediately no matter what positive ms to wait
  @param timeUnit the time unit of the timeout
  @return An object from the pool, or null if can't get one in the given waitTime
  @throws MongoTimeoutException if the timeout has been exceeded