Java Servlet中的静态变量行为

Che*_*Che 8 java static multithreading servlets

我正在开发一个java servlet,在运行时,在新线程中启动不同的对象方法.这些线程应该访问描述特定servlet实例的变量,比如jobId.出于这个原因,我将jobId变量声明为static.servlet构造函数正在为每个servlet实例(调用)计算此值.如果servlet同时被调用几次,我就会徘徊,静态jobId变量在调用之间共享,这意味着一些线程将获得错误的jobId,或者每次调用都计算一次 - 所以线程是启动的特定servlet将使用为此特定servlet计算的jobId(这是我希望它工作的方式).有任何想法吗?非常感谢!

Bal*_*usC 29

servlet只在webapp启动时创建一次,并在所有请求之间共享.静态与否,每个类/实例变量将在所有请求/会话之间共享.您不希望将请求/会话范围数据分配给它们.而是声明/将它们指定为方法本地变量.例如

public class MyServlet extends HttpServlet {
    private static Object thisIsNotThreadsafe;
    private Object thisIsAlsoNotThreadsafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadsafe;

        thisIsNotThreadsafe = request.getParameter("foo"); // BAD! Shared among all requests.
        thisIsAlsoNotThreadsafe = request.getParameter("foo"); // BAD! Shared among all requests.
        thisIsThreadsafe = request.getParameter("foo"); // Good.
    }
}
Run Code Online (Sandbox Code Playgroud)

存在遗留和已弃用的 SingleThreadModel接口,您可以让servlet在每个请求期间强制创建.但这是一个糟糕的设计,并且不必要地昂贵.这也是它被弃用的原因.

也可以看看:


Col*_*ert 2

static意味着每个实例都将访问相同的值。
因此连接到 servlet 的每个用户都将访问相同的值。当 2 个或更多用户连接在一起时,您的 jobId 可能会错误。

您必须为每个连接获取自己的值并将其存储在其他地方。


资源 :

关于同一主题: