Uploaded image for project: 'Commons BeanUtils'
  1. Commons BeanUtils
  2. BEANUTILS-318

Many threads are stuck in infinite loops in MethodUtils because static WeakHashMap is not thread safe

VotersWatch issueWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.7.0
    • 1.8.0
    • Bean / Property Utils
    • None
    • Weblogic 9.2 on Linux, but should not be relevant

    Description

      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]

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            niallp Niall Pemberton
            syl20lego Sylvain Legault
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment