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 IllegalStateException("Bad concurrency: descriptor already present in cache");
                        }
                        CACHE.put(type, descriptor);
                    }
                }
            } finally {
                LOCK.unlock();
            }
        }
        return descriptor;
    }