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

标签 java

假设,我有一个 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/

相关文章:

java - 将帖子发布到 REST API 时出现不支持的媒体类型错误

java - Java 中的构造函数和隐藏字段

如果有焦点组件,则不会执行场景的 JavaFX Key Pressed 事件

java - 错误 : Unable to run mksdcard SDK tool

java - 仅使用 Java 从数据库填充微调器?

java - 我们可以在 IntelliJ IDE 中测量代码性能吗

java - 将 java ClassLoader 添加到堆而不是 perm gen

java - 对象或原始类型

Java 复杂的列表数组迭代

java - 单击按钮时关闭 JFrame Pane