Author: markt
Date: Fri Oct 28 15:11:14 2011
New Revision: 1190389
URL: http://svn.apache.org/viewvc?rev=1190389&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=52091
Address performance issues related to lock contention in StandardWrapper
Patch provided by Taiki Sugawara.
Modified:
tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java?rev=1190389&r1=1190388&r2=1190389&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java Fri Oct 28
15:11:14 2011
@@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Stack;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.management.ListenerNotFoundException;
import javax.management.MBeanNotificationInfo;
@@ -275,6 +276,15 @@ public class StandardWrapper extends Con
*/
protected static Class<?>[] classType = new Class[]{ServletConfig.class};
+ private final ReentrantReadWriteLock parametersLock =
+ new ReentrantReadWriteLock();
+
+ private final ReentrantReadWriteLock mappingsLock =
+ new ReentrantReadWriteLock();
+
+ private final ReentrantReadWriteLock referencesLock =
+ new ReentrantReadWriteLock();
+
// ------------------------------------------------------------- Properties
@@ -712,8 +722,11 @@ public class StandardWrapper extends Con
@Override
public void addInitParameter(String name, String value) {
- synchronized (parameters) {
+ try {
+ parametersLock.writeLock().lock();
parameters.put(name, value);
+ } finally {
+ parametersLock.writeLock().unlock();
}
fireContainerEvent("addInitParameter", name);
@@ -741,8 +754,11 @@ public class StandardWrapper extends Con
@Override
public void addMapping(String mapping) {
- synchronized (mappings) {
+ try {
+ mappingsLock.writeLock().lock();
mappings.add(mapping);
+ } finally {
+ mappingsLock.writeLock().unlock();
}
if(parent.getState().equals(LifecycleState.STARTED))
fireContainerEvent(ADD_MAPPING_EVENT, mapping);
@@ -760,8 +776,11 @@ public class StandardWrapper extends Con
@Override
public void addSecurityReference(String name, String link) {
- synchronized (references) {
+ try {
+ referencesLock.writeLock().lock();
references.put(name, link);
+ } finally {
+ referencesLock.writeLock().unlock();
}
fireContainerEvent("addSecurityReference", name);
@@ -916,8 +935,11 @@ public class StandardWrapper extends Con
@Override
public String findInitParameter(String name) {
- synchronized (parameters) {
+ try {
+ parametersLock.readLock().lock();
return parameters.get(name);
+ } finally {
+ parametersLock.readLock().unlock();
}
}
@@ -930,9 +952,12 @@ public class StandardWrapper extends Con
@Override
public String[] findInitParameters() {
- synchronized (parameters) {
+ try {
+ parametersLock.readLock().lock();
String results[] = new String[parameters.size()];
return parameters.keySet().toArray(results);
+ } finally {
+ parametersLock.readLock().unlock();
}
}
@@ -944,8 +969,11 @@ public class StandardWrapper extends Con
@Override
public String[] findMappings() {
- synchronized (mappings) {
+ try {
+ mappingsLock.readLock().lock();
return mappings.toArray(new String[mappings.size()]);
+ } finally {
+ mappingsLock.readLock().unlock();
}
}
@@ -960,8 +988,11 @@ public class StandardWrapper extends Con
@Override
public String findSecurityReference(String name) {
- synchronized (references) {
+ try {
+ referencesLock.readLock().lock();
return references.get(name);
+ } finally {
+ referencesLock.readLock().unlock();
}
}
@@ -974,9 +1005,12 @@ public class StandardWrapper extends Con
@Override
public String[] findSecurityReferences() {
- synchronized (references) {
+ try {
+ referencesLock.readLock().lock();
String results[] = new String[references.size()];
return references.keySet().toArray(results);
+ } finally {
+ referencesLock.readLock().unlock();
}
}
@@ -1224,8 +1258,11 @@ public class StandardWrapper extends Con
@Override
public void removeInitParameter(String name) {
- synchronized (parameters) {
+ try {
+ parametersLock.writeLock().lock();
parameters.remove(name);
+ } finally {
+ parametersLock.writeLock().unlock();
}
fireContainerEvent("removeInitParameter", name);
@@ -1253,8 +1290,11 @@ public class StandardWrapper extends Con
@Override
public void removeMapping(String mapping) {
- synchronized (mappings) {
+ try {
+ mappingsLock.writeLock().lock();
mappings.remove(mapping);
+ } finally {
+ mappingsLock.writeLock().unlock();
}
if(parent.getState().equals(LifecycleState.STARTED))
fireContainerEvent(REMOVE_MAPPING_EVENT, mapping);
@@ -1270,8 +1310,11 @@ public class StandardWrapper extends Con
@Override
public void removeSecurityReference(String name) {
- synchronized (references) {
+ try {
+ referencesLock.writeLock().lock();
references.remove(name);
+ } finally {
+ referencesLock.writeLock().unlock();
}
fireContainerEvent("removeSecurityReference", name);
@@ -1481,8 +1524,11 @@ public class StandardWrapper extends Con
@Override
public Enumeration<String> getInitParameterNames() {
- synchronized (parameters) {
+ try {
+ parametersLock.readLock().lock();
return (new Enumerator<String>(parameters.keySet()));
+ } finally {
+ parametersLock.readLock().unlock();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]