List<AnnotationData> (@NotNull Object cacheKey, @NotNull Supplier<? extends List<AnnotationData>> dataSupplier) { if (!hasAnyAnnotationsRoots()) return Collections.emptyList(); List<AnnotationData> cached; while (true) { cached = (List<AnnotationData>)cache.get(cacheKey); if (cached == NO_DATA || !cached.isEmpty()) return cached; List<AnnotationData> computed = dataSupplier.get(); if (cache.replace(cacheKey, cached, computed)) { cached = computed; break; } } return cached; }