docs: @Override
    public ValueHolder<V> getAndRemove(final K key) throws StoreAccessException {
      checkKey(key);
  
      getAndRemoveObserver.begin();
  
      final AtomicReference<ValueHolder<V>> valueHolderAtomicReference = new AtomicReference<>();
      BiFunction<K, OffHeapValueHolder<V>, OffHeapValueHolder<V>> computeFunction = (mappedKey, mappedValue) -> {
        long now = timeSource.getTimeMillis();
        if (mappedValue == null || mappedValue.isExpired(now)) {
          if (mappedValue != null) {
            onExpirationInCachingTier(mappedValue, key);
          }
          return null;
        }
        mappedValue.detach();
        valueHolderAtomicReference.set(mappedValue);
        return null;
      };
  
      try {
        backingMap().compute(key, computeFunction, false);
        ValueHolder<V> result = valueHolderAtomicReference.get();
        if (result == null) {
          getAndRemoveObserver.end(LowerCachingTierOperationsOutcome.GetAndRemoveOutcome.MISS);
        } else {
          getAndRemoveObserver.end(LowerCachingTierOperationsOutcome.GetAndRemoveOutcome.HIT_REMOVED);
        }
        return result;
      } catch (RuntimeException re) {
        throw handleException(re);
      }
    }