extended synchronization for methodResolverCache (SPR-7525)

This commit is contained in:
Juergen Hoeller 2010-09-06 20:41:50 +00:00
parent 479b4c1b84
commit e035477e6a
2 changed files with 17 additions and 15 deletions

View File

@ -29,7 +29,6 @@ import java.util.LinkedHashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.portlet.ActionRequest; import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse; import javax.portlet.ActionResponse;
import javax.portlet.ClientDataRequest; import javax.portlet.ClientDataRequest;
@ -152,7 +151,7 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator
private BeanExpressionContext expressionContext; private BeanExpressionContext expressionContext;
private final Map<Class<?>, PortletHandlerMethodResolver> methodResolverCache = private final Map<Class<?>, PortletHandlerMethodResolver> methodResolverCache =
new ConcurrentHashMap<Class<?>, PortletHandlerMethodResolver>(); new HashMap<Class<?>, PortletHandlerMethodResolver>();
/** /**
@ -393,12 +392,14 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator
*/ */
private PortletHandlerMethodResolver getMethodResolver(Object handler) { private PortletHandlerMethodResolver getMethodResolver(Object handler) {
Class handlerClass = ClassUtils.getUserClass(handler); Class handlerClass = ClassUtils.getUserClass(handler);
PortletHandlerMethodResolver resolver = this.methodResolverCache.get(handlerClass); synchronized (this.methodResolverCache) {
if (resolver == null) { PortletHandlerMethodResolver resolver = this.methodResolverCache.get(handlerClass);
resolver = new PortletHandlerMethodResolver(handlerClass); if (resolver == null) {
this.methodResolverCache.put(handlerClass, resolver); resolver = new PortletHandlerMethodResolver(handlerClass);
this.methodResolverCache.put(handlerClass, resolver);
}
return resolver;
} }
return resolver;
} }

View File

@ -34,7 +34,6 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
@ -184,7 +183,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
private BeanExpressionContext expressionContext; private BeanExpressionContext expressionContext;
private final Map<Class<?>, ServletHandlerMethodResolver> methodResolverCache = private final Map<Class<?>, ServletHandlerMethodResolver> methodResolverCache =
new ConcurrentHashMap<Class<?>, ServletHandlerMethodResolver>(); new HashMap<Class<?>, ServletHandlerMethodResolver>();
public AnnotationMethodHandlerAdapter() { public AnnotationMethodHandlerAdapter() {
@ -194,7 +193,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
// See SPR-7316 // See SPR-7316
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(); StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
stringHttpMessageConverter.setWriteAcceptCharset(false); stringHttpMessageConverter.setWriteAcceptCharset(false);
messageConverters = new HttpMessageConverter[]{new ByteArrayHttpMessageConverter(), stringHttpMessageConverter, this.messageConverters = new HttpMessageConverter[]{new ByteArrayHttpMessageConverter(), stringHttpMessageConverter,
new SourceHttpMessageConverter(), new XmlAwareFormHttpMessageConverter()}; new SourceHttpMessageConverter(), new XmlAwareFormHttpMessageConverter()};
} }
@ -440,12 +439,14 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
*/ */
private ServletHandlerMethodResolver getMethodResolver(Object handler) { private ServletHandlerMethodResolver getMethodResolver(Object handler) {
Class handlerClass = ClassUtils.getUserClass(handler); Class handlerClass = ClassUtils.getUserClass(handler);
ServletHandlerMethodResolver resolver = this.methodResolverCache.get(handlerClass); synchronized (this.methodResolverCache) {
if (resolver == null) { ServletHandlerMethodResolver resolver = this.methodResolverCache.get(handlerClass);
resolver = new ServletHandlerMethodResolver(handlerClass); if (resolver == null) {
this.methodResolverCache.put(handlerClass, resolver); resolver = new ServletHandlerMethodResolver(handlerClass);
this.methodResolverCache.put(handlerClass, resolver);
}
return resolver;
} }
return resolver;
} }