CLONE - MethodUtils is not thread safe because WeakFastHashMap which uses
WeakHashMap is not thread-safe.
---------------------------------------------------------------------------------------------------------
Key: BEANUTILS-373
URL: https://issues.apache.org/jira/browse/BEANUTILS-373
Project: Commons BeanUtils
Issue Type: Bug
Components: Bean / Property Utils
Affects Versions: 1.7.0
Environment: Weblogic 9.2 on Linux, but should not be relevant
Reporter: Andrew Sunde
Assignee: Niall Pemberton
Fix For: 1.8.0
The problem lies in the class org.apache.commons.beanutils.MethodUtils. This
class is keeping a global cache in a non synchronized WeakHashMap. WeakHashMap
is not thread safe and required external synchronization. The lack of
synchronization can cause corruption and the WeakHashMap.get() method to go
into an infinite loop.
Googling "WeakHashMap infinite loop" returns many cases of similar problem with
WeakHashMap. The solution is to decorate the WeakHashMap in a synchronized Map
as described in this thread:
http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg08824.html
The modification to make the MethodUtils cache thread safe is a one line
change.
Before:
private static WeakHashMap cache = new WeakHashMap();
After:
private static Map cache = Collections.synchronizedMap(new WeakHashMap());
Example of thread dump
"ExecuteThread: '0' for queue: 'weblogic.kernel.Default'" id=13 idx=0x3c
tid=5905 prio=5 alive, daemon
at
org/apache/commons/beanutils/MethodUtils$MethodDescriptor.equals(MethodUtils.java:828)[optimized]
at java/util/WeakHashMap.eq(WeakHashMap.java:254)[inlined]
at java/util/WeakHashMap.get(WeakHashMap.java:345)[optimized]
at
org/apache/commons/beanutils/MethodUtils.getMatchingAccessibleMethod(MethodUtils.java:530)[optimized]
at
org/apache/commons/beanutils/MethodUtils.invokeMethod(MethodUtils.java:209)[inlined]
::::
"ExecuteThread: '1' for queue: 'weblogic.kernel.Default'" id=14 idx=0x40
tid=5906 prio=5 alive, daemon
at
org/apache/commons/beanutils/MethodUtils$MethodDescriptor.equals(MethodUtils.java:833)[optimized]
at java/util/WeakHashMap.eq(WeakHashMap.java:254)[inlined]
at java/util/WeakHashMap.get(WeakHashMap.java:345)[optimized]
at
org/apache/commons/beanutils/MethodUtils.getMatchingAccessibleMethod(MethodUtils.java:530)[optimized]
at
org/apache/commons/beanutils/MethodUtils.invokeMethod(MethodUtils.java:209)[inlined]
:::
"ExecuteThread: '2' for queue: 'weblogic.kernel.Default'" id=15 idx=0x44
tid=5907 prio=5 alive, daemon
at
org/apache/commons/beanutils/MethodUtils$MethodDescriptor.equals(MethodUtils.java:833)[optimized]
at java/util/WeakHashMap.eq(WeakHashMap.java:254)[inlined]
at java/util/WeakHashMap.get(WeakHashMap.java:345)[optimized]
at
org/apache/commons/beanutils/MethodUtils.getMatchingAccessibleMethod(MethodUtils.java:530)[optimized]
at
org/apache/commons/beanutils/MethodUtils.invokeMethod(MethodUtils.java:209)[inlined]
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.