Author: markt
Date: Thu May 26 12:48:24 2016
New Revision: 1745599

URL: http://svn.apache.org/viewvc?rev=1745599&view=rev
Log:
Make resourceEntries a ConcurrentHashMap else there is a risk of a threading 
issues when different threads read and write at the same time.

Modified:
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?rev=1745599&r1=1745598&r2=1745599&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
Thu May 26 12:48:24 2016
@@ -56,6 +56,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.jar.Attributes;
@@ -335,7 +336,7 @@ public abstract class WebappClassLoaderB
      * The cache of ResourceEntry for classes and resources we have loaded,
      * keyed by resource name.
      */
-    protected HashMap<String, ResourceEntry> resourceEntries = new 
HashMap<String, ResourceEntry>();
+    protected Map<String, ResourceEntry> resourceEntries = new 
ConcurrentHashMap<String, ResourceEntry>();
 
 
     /**
@@ -2301,9 +2302,8 @@ public abstract class WebappClassLoaderB
 
     private final void clearReferencesStaticFinal() {
 
-        @SuppressWarnings("unchecked") // resourceEntries is HashMap<String, 
ResourceEntry>
-        Collection<ResourceEntry> values =
-            ((HashMap<String,ResourceEntry>) resourceEntries.clone()).values();
+        List<ResourceEntry> values = new ArrayList<ResourceEntry>();
+        values.addAll(resourceEntries.values());
         Iterator<ResourceEntry> loadedClasses = values.iterator();
         //
         // walk through all loaded class to trigger initialization for

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1745599&r1=1745598&r2=1745599&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Thu May 26 12:48:24 2016
@@ -109,6 +109,10 @@
         leaks is made. Log a warning if running on Java 9 with this check
         enabled but without the command line option it requires. (markt)
       </fix>
+      <fix>
+        Fix potential concurrency issue with web application class loader with
+        concurrent reads and writes of the resource cache. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to