code: public static GenericsInfo create(final Class<?> type, final Class<?>... ignoreClasses) {
          GenericsInfo descriptor = ignoreClasses.length > 0
                  ? GenericInfoUtils.create(type, ignoreClasses) : CACHE.get(type);
          if (descriptor == null) {
              LOCK.lock();
              try {
                  if (CACHE.get(type) != null) {
                      // descriptor could be created while thread wait for lock
                      descriptor = CACHE.get(type);
                  } else {
                      descriptor = GenericInfoUtils.create(type);
                      if (isCacheEnabled()) {
                          // internal check
                          if (CACHE.get(type) != null) {
                              throw new ConcurrentModificationException("Descriptor already present in cache");
                          }
                          CACHE.put(type, descriptor);
                      }
                  }
              } finally {
                  LOCK.unlock();
              }
          }
          return descriptor;
      }
docs: Note: ignore classes switch off caching for resolved descriptor (and if completely resolved version
  contained in cache limited version will be composed one more time).
  
  @param type          finder type to investigate
  @param ignoreClasses list of classes to ignore during inspection (useful to avoid interface clashes)
  @return descriptor for class hierarchy generics substitution