说,我有一个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());
  }


}

===============>>#1 票数:3 已采纳

Servlet是在请求之间共享的,因此不能,它不是线程安全的。 servlet对象的作用域为web.xml中的<servlet>声明。

容器为每个servlet创建<servlet-class>的实例,并调用其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());
  }

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

===============>>#2 票数:1

不,servlet不是线程安全的。 Servlet不应以这种方式公开任何可变状态。

  ask by lannyboy translate from so

未解决问题?本站智能推荐: