diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java
index 6cd757eae..4eea2af3a 100644
--- a/src/org/redkale/net/PrepareServlet.java
+++ b/src/org/redkale/net/PrepareServlet.java
@@ -15,7 +15,7 @@ import org.redkale.util.*;
/**
* 根Servlet, 一个Server只能存在一个根Servlet
- *
+ *
* 用于分发Request请求
*
*
@@ -34,9 +34,33 @@ public abstract class PrepareServlet servlets = new HashSet<>();
+ private final Object lock1 = new Object();
- protected final Map mappings = new HashMap<>();
+ private Set servlets = new HashSet<>();
+
+ private final Object lock2 = new Object();
+
+ private Map mappings = new HashMap<>();
+
+ protected void putServlet(S servlet) {
+ synchronized (lock1) {
+ Set newservlets = new HashSet<>(servlets);
+ newservlets.add(servlet);
+ this.servlets = newservlets;
+ }
+ }
+
+ protected void putMapping(K key, S value) {
+ synchronized (lock2) {
+ Map newmappings = new HashMap<>(mappings);
+ newmappings.put(key, value);
+ this.mappings = newmappings;
+ }
+ }
+
+ protected S mappingServlet(K key) {
+ return mappings.get(key);
+ }
public abstract void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings);
diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java
index 986d95e24..b8f544d55 100644
--- a/src/org/redkale/net/http/HttpPrepareServlet.java
+++ b/src/org/redkale/net/http/HttpPrepareServlet.java
@@ -37,7 +37,8 @@ public class HttpPrepareServlet extends PrepareServlet {
+ Collection servlets = getServlets();
+ servlets.forEach(s -> {
if (s instanceof WebSocketServlet) {
((WebSocketServlet) s).preInit(context, getServletConf(s));
} else if (s instanceof HttpBaseServlet) {
@@ -47,7 +48,7 @@ public class HttpPrepareServlet extends PrepareServlet {
+ servlets.forEach(s -> {
watch.inject(s);
});
}
@@ -82,7 +83,7 @@ public class HttpPrepareServlet extends PrepareServlet servlet = this.mappings.isEmpty() ? null : this.mappings.get(uri);
+ Servlet servlet = mappingServlet(uri);
if (servlet == null && this.regArray != null) {
for (SimpleEntry, HttpServlet> en : regArray) {
if (en.getKey().test(uri)) {
@@ -138,7 +139,7 @@ public class HttpPrepareServlet extends PrepareServlet(Pattern.compile(mapping).asPredicate(), servlet);
}
} else if (mapping != null && !mapping.isEmpty()) {
- super.mappings.put(mapping, servlet);
+ putMapping(mapping, servlet);
}
if (this.allMapStrings.containsKey(mapping)) {
Class old = this.allMapStrings.get(mapping);
@@ -148,7 +149,7 @@ public class HttpPrepareServlet extends PrepareServlet {
+ getServlets().forEach(s -> {
s.destroy(context, getServletConf(s));
if (s instanceof WebSocketServlet) {
((WebSocketServlet) s).postDestroy(context, getServletConf(s));
diff --git a/src/org/redkale/net/sncp/SncpPrepareServlet.java b/src/org/redkale/net/sncp/SncpPrepareServlet.java
index 167e050e5..934bb5220 100644
--- a/src/org/redkale/net/sncp/SncpPrepareServlet.java
+++ b/src/org/redkale/net/sncp/SncpPrepareServlet.java
@@ -30,26 +30,22 @@ public class SncpPrepareServlet extends PrepareServlet getSncpServlets() {
- ArrayList list = new ArrayList<>(servlets.size());
- servlets.forEach(x -> list.add((SncpServlet) x));
- return list;
+ return new ArrayList<>(getServlets());
}
@Override
public void init(SncpContext context, AnyValue config) {
- servlets.forEach(s -> s.init(context, getServletConf(s)));
+ getServlets().forEach(s -> s.init(context, getServletConf(s)));
}
@Override
public void destroy(SncpContext context, AnyValue config) {
- servlets.forEach(s -> s.destroy(context, getServletConf(s)));
+ getServlets().forEach(s -> s.destroy(context, getServletConf(s)));
}
@Override
@@ -58,7 +54,7 @@ public class SncpPrepareServlet extends PrepareServlet