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.

Reply via email to