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

    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

            People

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

              Dates

                Created:
                Updated:
                Resolved: