java - Servlet 适合复合操作吗?

标签 java servlets thread-safety

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/

相关文章:

java - 调试 apache heron 调度程序

java - 在 jooq 中访问 sql-array 项目

java - 用java将视频上传到youtube

java - 按顺序使用 REST API,多线程环境中每次调用之间至少间隔 100 毫秒。 (带 RestTemplate)

java - Android Studio 中的方法引用

java - 为什么 StringBuffer#append 抛出 StringIndexOutOfBoundsException

java - 从另一个类运行 servlet 类

java - RequestDispatcher.include(...) 附加 servlet 的包名称

multithreading - Delphi 中增加和返回整数的线程安全方法

java - 线程、对象状态