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 20:06:27 UTC

[jira] Commented: (BEANUTILS-318) Many threads are stuck in infinite loops in MethodUtils because static WeakHashMap is not thread safe

    [ https://issues.apache.org/jira/browse/BEANUTILS-318?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12847517#action_12847517 ] 

Andrew Sunde commented on BEANUTILS-318:
----------------------------------------

See:  	https://issues.apache.org/jira/browse/BEANUTILS-373

Similar issue reopened.

> Many threads are stuck in infinite loops in MethodUtils  because static WeakHashMap is not thread safe
> ------------------------------------------------------------------------------------------------------
>
>                 Key: BEANUTILS-318
>                 URL: https://issues.apache.org/jira/browse/BEANUTILS-318
>             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: Sylvain Legault
>            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.