You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2012/11/27 13:29:36 UTC
svn commit: r1414150 -
/tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
Author: markt
Date: Tue Nov 27 12:29:36 2012
New Revision: 1414150
URL: http://svn.apache.org/viewvc?rev=1414150&view=rev
Log:
FRom kkolinko:
A ReadWriteLock cannot be used to guard a WeakHashMap. The
WeakHashMap may modify itself on get(), as it processes the reference
queue of items removed by GC.
Either a plain old lock / synchronization is needed, or some other solution
(e.g. org.apache.tomcat.util.collections.ManagedConcurrentWeakHashMap )
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java?rev=1414150&r1=1414149&r2=1414150&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java Tue Nov 27 12:29:36 2012
@@ -18,9 +18,6 @@ package org.apache.tomcat.websocket;
import java.util.Map;
import java.util.WeakHashMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.websocket.DeploymentException;
import javax.websocket.Endpoint;
@@ -38,40 +35,24 @@ public class ServerContainerImpl extends
// stopped
private static Map<ClassLoader, ServerContainerImpl>
classLoaderContainerMap = new WeakHashMap<>();
- private static ReadWriteLock classLoaderContainerMapLock =
- new ReentrantReadWriteLock();
+ private static Object classLoaderContainerMapLock = new Object();
/**
- * Intended to be used be implementations of {@link
+ * Intended to be used by implementations of {@link
* javax.websocket.ContainerProvider#getServerContainer()} to obtain the
* correct {@link ServerContainer} instance.
*/
public static ServerContainerImpl getServerContainer() {
- // TODO SecurityManager
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
ServerContainerImpl result = null;
- Lock readlock = classLoaderContainerMapLock.readLock();
- try {
- readlock.lock();
+ synchronized (classLoaderContainerMapLock) {
result = classLoaderContainerMap.get(tccl);
- } finally {
- readlock.unlock();
- }
-
- if (result == null) {
- Lock writeLock = classLoaderContainerMapLock.writeLock();
- try {
- writeLock.lock();
- result = classLoaderContainerMap.get(tccl);
- if (result == null) {
- result = new ServerContainerImpl();
- classLoaderContainerMap.put(tccl, result);
- }
- } finally {
- writeLock.unlock();
+ if (result == null) {
+ result = new ServerContainerImpl();
+ classLoaderContainerMap.put(tccl, result);
}
}
return result;
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org