From 7e7d4baa31e5f3cb1c8239cff4927fb8dcf4cc53 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 1 Mar 2018 16:16:18 +0100 Subject: [PATCH] DATACMNS-1271 - Polishing. Use ConcurrentHashMap in AnnotationBasedPersistentProperty for thread-safe annotation caching. Reintroduce eager cache check to prevent lambda instances on positive cache hits. --- .../model/AnnotationBasedPersistentProperty.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/mapping/model/AnnotationBasedPersistentProperty.java b/src/main/java/org/springframework/data/mapping/model/AnnotationBasedPersistentProperty.java index d37466141..8fe926ccc 100644 --- a/src/main/java/org/springframework/data/mapping/model/AnnotationBasedPersistentProperty.java +++ b/src/main/java/org/springframework/data/mapping/model/AnnotationBasedPersistentProperty.java @@ -17,9 +17,9 @@ package org.springframework.data.mapping.model; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; -import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -56,7 +56,7 @@ public abstract class AnnotationBasedPersistentProperty

, Optional> annotationCache = new HashMap<>(); + private final Map, Optional> annotationCache = new ConcurrentHashMap<>(); private final Lazy usePropertyAccess = Lazy.of(() -> { @@ -230,6 +230,12 @@ public abstract class AnnotationBasedPersistentProperty

Optional doFindAnnotation(Class annotationType) { + Optional annotation = annotationCache.get(annotationType); + + if (annotation != null) { + return (Optional) annotation; + } + return (Optional) annotationCache.computeIfAbsent(annotationType, type -> { return getAccessors() //