|
24 | 24 | import java.util.Locale;
|
25 | 25 | import java.util.Map;
|
26 | 26 | import java.util.TreeSet;
|
27 |
| -import java.util.WeakHashMap; |
| 27 | +import java.util.concurrent.ConcurrentHashMap; |
| 28 | +import java.util.concurrent.ConcurrentMap; |
28 | 29 |
|
29 | 30 | /**
|
30 | 31 | * Computes class information to determine data key name/value pairs associated with the class.
|
|
37 | 38 | public final class ClassInfo {
|
38 | 39 |
|
39 | 40 | /** Class information cache, with case-sensitive field names. */
|
40 |
| - private static final Map<Class<?>, ClassInfo> CACHE = new WeakHashMap<Class<?>, ClassInfo>(); |
| 41 | + private static final ConcurrentMap<Class<?>, ClassInfo> CACHE = |
| 42 | + new ConcurrentHashMap<Class<?>, ClassInfo>(); |
41 | 43 |
|
42 | 44 | /** Class information cache, with case-insensitive fields names. */
|
43 |
| - private static final Map<Class<?>, ClassInfo> CACHE_IGNORE_CASE = |
44 |
| - new WeakHashMap<Class<?>, ClassInfo>(); |
| 45 | + private static final ConcurrentMap<Class<?>, ClassInfo> CACHE_IGNORE_CASE = |
| 46 | + new ConcurrentHashMap<Class<?>, ClassInfo>(); |
45 | 47 |
|
46 | 48 | /** Class. */
|
47 | 49 | private final Class<?> clazz;
|
@@ -81,16 +83,15 @@ public static ClassInfo of(Class<?> underlyingClass, boolean ignoreCase) {
|
81 | 83 | if (underlyingClass == null) {
|
82 | 84 | return null;
|
83 | 85 | }
|
84 |
| - final Map<Class<?>, ClassInfo> cache = ignoreCase ? CACHE_IGNORE_CASE : CACHE; |
85 |
| - ClassInfo classInfo; |
86 |
| - synchronized (cache) { |
87 |
| - classInfo = cache.get(underlyingClass); |
88 |
| - if (classInfo == null) { |
89 |
| - classInfo = new ClassInfo(underlyingClass, ignoreCase); |
90 |
| - cache.put(underlyingClass, classInfo); |
91 |
| - } |
92 |
| - } |
93 |
| - return classInfo; |
| 86 | + final ConcurrentMap<Class<?>, ClassInfo> cache = ignoreCase ? CACHE_IGNORE_CASE : CACHE; |
| 87 | + |
| 88 | + // Logic copied from ConcurrentMap.computeIfAbsent |
| 89 | + ClassInfo v, newValue; |
| 90 | + return ((v = cache.get(underlyingClass)) == null |
| 91 | + && (newValue = new ClassInfo(underlyingClass, ignoreCase)) != null |
| 92 | + && (v = cache.putIfAbsent(underlyingClass, newValue)) == null) |
| 93 | + ? newValue |
| 94 | + : v; |
94 | 95 | }
|
95 | 96 |
|
96 | 97 | /**
|
|
0 commit comments