docs: public final T get(Object... args) {
          // Grab a read lock to try retrieving the object
          this.readLock.lock();
          try {
  
              // See if the object already exists and is valid
              final T value = this.retrieve(args);
              if (!this.invalid(value, args)) {
                  if (getLogger().isDebugEnabled()) {
                      getLogger().debug("Using retrieved (first attempt) Object='" + value + "'");
                  }
  
                  return value;
              }
          } finally {
              // Release the read lock
              this.readLock.unlock();
          }
  
          // Object must not be valid, switch to a write lock
          this.writeLock.lock();
          try {
              // Check again if the object exists and is valid
              T value = this.retrieve(args);
              if (this.invalid(value, args)) {
  
                  // Object is not valid, create it
                  value = this.create(args);
  
                  if (getLogger().isDebugEnabled()) {
                      getLogger().debug("Created new Object='" + value + "'");
                  }
              } else if (getLogger().isDebugEnabled()) {
                  getLogger().debug("Using retrieved (second attempt) Object='" + value + "'");
              }
  
              return value;
          } finally {
              // switch back to the read lock
              this.writeLock.unlock();
          }
      }