Iterator over map of SoftReferences susceptible to
ConcurrentModificationException
----------------------------------------------------------------------------------
Key: WINK-255
URL: https://issues.apache.org/jira/browse/WINK-255
Project: Wink
Issue Type: Bug
Components: Common
Affects Versions: 1.1
Reporter: Mike Rheinheimer
Fix For: 1.1
In org/apache/wink/common/internal/utils/SoftConcurrentMap.put, a copy of the
map is made by calling the WeakHashMap(Map) copy constructor.
Under the WeakHashMap(Map) constructor, java.util.AbstractMap.putAll is called,
which uses an iterator. Iterators, as we all know, are not thread-safe; they
are susceptible to ConcurrentModificationExceptions. Note that this method is
already 'synchronized'. However, that does not protect this.map from the
silent garbage collector thread, which may remove something at any time due to
the internal values being "SoftReferences". Instead of synchronizing on
this.map, let's just catch ConcurrentModificationException ignore it, and retry
in the while loop.
Please see the patch. I have tested this many times in a multi-threaded
environment, and even done performance testing on it. The fix looks good.
However, I'll leave it up for a few days in case anyone has a better idea
before I commit it.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.