Skip to content

Commit 0ebb4a3

Browse files
committed
Refactor JXPathIntrospector internal static maps to use concurrent
classes instead of synchronization
1 parent 76d224d commit 0ebb4a3

File tree

2 files changed

+16
-25
lines changed

2 files changed

+16
-25
lines changed

src/changes/changes.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ The <action> type attribute can be add,update,fix,remove.
5151
<!-- FIX -->
5252
<action type="fix" dev="ggregory" due-to="Gary Gregory">POM assembly:single does not generate binary convenience files (tar/zip).</action>
5353
<action type="fix" dev="ggregory" due-to="Dima1224, Gary Gregory">Make dynamicPropertyHandlerMap in ValueUtils thread-safe #251.</action>
54+
<action type="fix" dev="ggregory" due-to="Gary Gregory">Refactor JXPathIntrospector internal static maps to use concurrent classes instead of synchronization.</action>
5455
<!-- ADD -->
5556
<!-- UPDATE -->
5657
<action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-parent from 81 to 91 #239, #262, #265.</action>

src/main/java/org/apache/commons/jxpath/JXPathIntrospector.java

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717

1818
package org.apache.commons.jxpath;
1919

20-
import java.util.Collections;
2120
import java.util.Date;
22-
import java.util.HashMap;
2321
import java.util.Map;
22+
import java.util.concurrent.ConcurrentHashMap;
23+
import java.util.concurrent.ConcurrentMap;
2424

2525
import org.apache.commons.jxpath.util.ClassLoaderUtil;
2626

@@ -29,8 +29,8 @@
2929
*/
3030
public class JXPathIntrospector {
3131

32-
private static Map<Class, JXPathBeanInfo> byClass = Collections.synchronizedMap(new HashMap<>());
33-
private static Map<Class, JXPathBeanInfo> byInterface = Collections.synchronizedMap(new HashMap<>());
32+
private static ConcurrentMap<Class, JXPathBeanInfo> byClass = new ConcurrentHashMap<>();
33+
private static ConcurrentMap<Class, JXPathBeanInfo> byInterface = new ConcurrentHashMap<>();
3434
static {
3535
registerAtomicClass(Class.class);
3636
registerAtomicClass(Boolean.TYPE);
@@ -130,20 +130,16 @@ private static synchronized JXPathBeanInfo findInformant(final Class beanClass)
130130
* @return JXPathBeanInfo
131131
*/
132132
public static JXPathBeanInfo getBeanInfo(final Class beanClass) {
133-
JXPathBeanInfo beanInfo = byClass.get(beanClass);
134-
if (beanInfo == null) {
135-
beanInfo = findDynamicBeanInfo(beanClass);
136-
if (beanInfo == null) {
137-
beanInfo = findInformant(beanClass);
138-
if (beanInfo == null) {
139-
beanInfo = new JXPathBasicBeanInfo(beanClass);
133+
return byClass.computeIfAbsent(beanClass, k -> {
134+
JXPathBeanInfo value = findDynamicBeanInfo(beanClass);
135+
if (value == null) {
136+
value = findInformant(beanClass);
137+
if (value == null) {
138+
value = new JXPathBasicBeanInfo(beanClass);
140139
}
141140
}
142-
synchronized (byClass) {
143-
byClass.put(beanClass, beanInfo);
144-
}
145-
}
146-
return beanInfo;
141+
return value;
142+
});
147143
}
148144

149145
/**
@@ -175,9 +171,7 @@ private static Object instantiate(final Class sibling, final String className) t
175171
* @param beanClass to register
176172
*/
177173
public static void registerAtomicClass(final Class beanClass) {
178-
synchronized (byClass) {
179-
byClass.put(beanClass, new JXPathBasicBeanInfo(beanClass, true));
180-
}
174+
byClass.computeIfAbsent(beanClass, k -> new JXPathBasicBeanInfo(beanClass, true));
181175
}
182176

183177
/**
@@ -190,13 +184,9 @@ public static void registerAtomicClass(final Class beanClass) {
190184
public static void registerDynamicClass(final Class beanClass, final Class dynamicPropertyHandlerClass) {
191185
final JXPathBasicBeanInfo bi = new JXPathBasicBeanInfo(beanClass, dynamicPropertyHandlerClass);
192186
if (beanClass.isInterface()) {
193-
synchronized (byInterface) {
194-
byInterface.put(beanClass, bi);
195-
}
187+
byInterface.put(beanClass, bi);
196188
} else {
197-
synchronized (byClass) {
198-
byClass.put(beanClass, bi);
199-
}
189+
byClass.put(beanClass, bi);
200190
}
201191
}
202192

0 commit comments

Comments
 (0)