Servlet 是非线程安全的,不同请求的方法调用之间的状态可能会丢失。
但是我可以在单个请求期间安全地保留自己的Servlet方法之间的状态以实现复合操作吗?
像这样:
public class MyServlet extends HttpServletRequest {
private String var;
void addH() {
var += "h";
}
void addI() {
var += "i";
}
void doGet(...) {
addH();
addI();
// var = "hi"?
}
}
在这种情况下,即使有并发请求,var
也会包含正确的值吗?换句话说,它的工作方式与 EJB 中的 Stateless Bean 一样吗?
最佳答案
不,你不能。正如您所说,servlet 不是线程安全的。请求所在的位置没有 protected “空间”。因此多个线程(以及请求)可以同时访问 var
。如果您想要这样一个 protected “空间”,您需要同步 doGet()
(这当然会破坏并发性)或执行类似使用 ThreadLocal
的操作,以便每个线程(因此请求)将拥有其自己的实例范围状态的单独副本。
如果您不需要在请求之外保留状态,则可以在 doGet()
中创建状态并将其传递给其他方法:
void doGet(...) {
StringBuilder var = new StringBuilder();
addH(var);
addI(var);
resp.write(var.toString());
}
void addH(StringBuilder var) {
var.append('h');
}
void addI(StringBuilder var) {
ver.append('i');
}
关于java - Servlet 适合复合操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29883816/