gpt4 book ai didi

java - HttpServlet.class 是否作为线程安全运行?

转载 作者:行者123 更新时间:2023-12-01 18:33:16 27 4
gpt4 key购买 nike

假设,我有一个 TestServlet 类,它声明为全局字符串变量。如果同时调用 TestServlet 类,则此“消息”字符串变量是否可以安全地打印而无需从并发线程交叉?

public class TestServlet extends HttpServlet {

private String message;

public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {

OutputStream os = response.getOutputStream();
message = UUID.randomUUID().toString();
os.write(message.getBytes());
}


}

最佳答案

Servlet 在请求之间共享,所以不,它不是线程安全的。 Servlet 对象的范围为 <servlet> web.xml 中的声明。

容器创建 <servlet-class> 的实例对于每个 servlet 并调用其 init方法。

这里的一些引用:

http://www.coderanch.com/t/473015/Servlets/java/Servlet-thread-safe

http://docs.oracle.com/javaee/5/tutorial/doc/bnafu.html

通常,如果您在 servlet 中存储状态,您应该考虑替代方案。为什么要在那里存储状态?国家与什么相关?它与请求有关吗?如果是这样,请使用 request.setAttribute 。如果要在同一用户的多个请求之间共享,请使用 request.getSession().setAttribute 。如果它应该被所有请求共享,那么 request.getServletContext().setAttribute .

如果状态特定于单个请求并且仅在该 servlet 的执行内,那么它应该只是方法中的局部变量。例如:

public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {

OutputStream os = response.getOutputStream();
String message = UUID.randomUUID().toString();
os.write(message.getBytes());
}

请注意,这里没有非局部变量。这是相当线程安全的。

关于java - HttpServlet.class 是否作为线程安全运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177602/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com