[
https://jira.jboss.org/jira/browse/JBAS-6381?page=com.atlassian.jira.plug...
]
Adrian Brock commented on JBAS-6381:
------------------------------------
For now I've just synchronized the TreeSets but this could obviously be done more
efficiently
(if the code wasn't so complicated to change. :-)
[ejort@warjort jboss-4.2]$ svn diff
Index: jmx/src/main/org/jboss/mx/loading/ClassLoaderUtils.java
===================================================================
--- jmx/src/main/org/jboss/mx/loading/ClassLoaderUtils.java (revision 82864)
+++ jmx/src/main/org/jboss/mx/loading/ClassLoaderUtils.java (working copy)
@@ -35,6 +35,7 @@
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedList;
@@ -222,7 +223,7 @@
*/
public static Set newPackageSet()
{
- return new TreeSet(repostiroyClassLoaderComparator);
+ return Collections.synchronizedSet(new TreeSet(repostiroyClassLoaderComparator));
}
/**
ConcurrentModification in UnifiedLoaderRepository3 packagesMap
--------------------------------------------------------------
Key: JBAS-6381
URL:
https://jira.jboss.org/jira/browse/JBAS-6381
Project: JBoss Application Server
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: ClassLoading
Affects Versions: JBossAS-4.2.3.GA
Reporter: Adrian Brock
Assignee: Scott M Stark
The UnifiedLoaderRepository3 has an internal packagesMap
which is currently a
ConcurrentHashMap<String, TreeSet<UnfiedClassLoader>>
where the TreeSet uses a comparator based on the PkgClassLoader/UnifiedClassLoader
order.
This TreeSet is not properly synchronized against changes, e.g. (un)deployment of a
classloader that
has a certain package while somebody is trying to load a class from that package.
This can lead to a
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:841)
at java.util.HashMap$KeyIterator.next(HashMap.java:877)
at java.util.AbstractCollection.addAll(AbstractCollection.java:318)
at java.util.TreeSet.addAll(TreeSet.java:258)
at
org.jboss.mx.loading.UnifiedLoaderRepository3.getPackageClassLoaders(UnifiedLoaderRepository3.java:246)
at org.jboss.mx.loading.LoadMgr3.beginLoadTask(LoadMgr3.java:178)
at
org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:514)
at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:408)
Rather than synchronizing the TreeSet, I'd suggest using a CopyOnWriteList whose
contents are presorted like the TreeSet.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira