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

CLONE - MethodUtils is not thread safe because WeakFastHashMap which uses WeakHashMap is not thread-safe.

VotersWatch issueWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.8.2
    • 1.8.3
    • 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 WeakFastHashMap (which claims to be syncronized). When operating in Fast mode (which is what the WeakFastHashMap is set to after it is created), it then access the underlining WeakHashMap without synchronization. Therefore this can lead to a corruption in the underlining HashMap.

      See the description of the WeakHashMap javadoc:
      From Java Sun: "
      Like most collection classes, this class is not synchronized. A synchronized WeakHashMap may be constructed using the Collections.synchronizedMap method.
      ....
      The behavior of the WeakHashMap class depends in part upon the actions of the garbage collector, so several familiar (though not required) Map invariants do not hold for this class. Because the garbage collector may discard keys at any time, a WeakHashMap may behave as though an unknown thread is silently removing entries.
      "

      Therefore even if you are doing a "get" from the hashmap, there is a chance that you could get a corrupted hashmap because the garbage collector could be changing the hashmap on the fly. This could lead to threads getting stuck in an infinite loop.

      The modification to make the MethodUtils cache thread safe is a one line change.
      Before:
      private static WeakFastHashMap cache = new WeakFastHashMap();

      After:
      private static Map cache = Collections.synchronizedMap(new WeakHashMap());

      Attachments

        Issue Links

        Activity

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

          People

            niallp Niall Pemberton
            andrew sunde Andrew Sunde
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment