@NotNull
  @Override
  public <T> T getData(@NotNull DataProvider<T> provider) {
    Object data = myMap.get(provider);
    if (data == null) {
      synchronized (myMap) {
        Object secondAttempt = myMap.get(provider);
        if (secondAttempt != null) {
          //noinspection unchecked
          return (T)secondAttempt;
        }
        T value = provider.create(this);
        myMap.put(provider, value);
        return value;
      }
    }
    else {
      //noinspection unchecked
      return (T)data;
    }
  }
@NotNull
  @Override
  public <T> T getData(@NotNull DataProvider<T> provider)