You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Andrew Sunde (JIRA)" <ji...@apache.org> on 2010/03/19 19:54:27 UTC
[jira] Updated: (BEANUTILS-373) CLONE - MethodUtils is not thread
safe because WeakFastHashMap which uses WeakHashMap is not thread-safe.
[ https://issues.apache.org/jira/browse/BEANUTILS-373?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andrew Sunde updated BEANUTILS-373:
-----------------------------------
Fix Version/s: (was: 1.8.0)
Affects Version/s: (was: 1.7.0)
1.8.2
> 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.8.2
> Environment: Weblogic 9.2 on Linux, but should not be relevant
> Reporter: Andrew Sunde
> Assignee: Niall Pemberton
>
> 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.