说,我有一个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

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

2回复

无法在Eclipse上打开声明(找不到源)-HttpServlet.class

我正在尝试在Eclipse Neon.1(Mac OS X)上打开声明。 打开其他类,例如PrintWriter.class可以正常工作,但是当我打开httpServlet.class的声明时。 找不到源。 下面是我现在正在努力的屏幕截图。 我已经搜索了这个问题,但是找不到解决方
4回复

有没有一种方法可以扩展httpservlet和线程

我需要标题中提到的问题的答案。
2回复

运行扩展HTTPServlet的简单类时出现404错误

以下代码是我的web.xml文件: 以下代码是扩展HTTPServlet类的简单类: 当我尝试在Tomcat 7上运行此代码时,它显示以下错误消息: 有人可以告诉我这段代码有什么问题吗? 并建议我如何成功运行它。
3回复

我们可以在Main方法Java类中运行HTTPServlet吗

我正在看Java中的简单Servlet的示例代码。 在此示例中,Servlet由WEB-INF / web.xml文件条目启动 我可以在main()方法内的Java应用程序中启动(com.mkyong.ServletDemo1)并调用方法。 可能吗 ? 谢谢您的帮助。
1回复

什么是HttpServlet类中的'service'方法?

下面是一个为学习而编写的简单servlet。 当浏览器访问此URI时: http://localhost:8081/ServletsJSPExample/servletexample , 通过分析http包的请求头,它显示了从浏览器发送的GET请求。 但是,在我的servlet中
3回复

为什么HttpServlet类是抽象的? [关闭]

我很困扰。 为什么HttpServlet类是抽象的? bean和pojo之间的基本区别是什么?
3回复

我的线程并行运行吗?

我有以下代码: 我得到的输出是: 从输出我不认为我的线程并行运行! 我应该在run方法中添加并发代码? 我在这里错过了什么吗?
5回复

该类是线程安全的吗?

此类是单身人士。 我不太擅长线程安全。 该类是线程安全的吗? 一些方法被省略,但是它们仅在一个线程中使用。 但是,这里列出的方法将同时从多个线程访问。
7回复

为什么这个类不是线程安全的?

谁能解释为什么上面的类不是线程安全的?
1回复

在HttpServlet中声明自己的方法是否安全? [重复]

这个问题已经在这里有了答案: servlet如何工作? 实例化,会话,共享变量和多线程 8个答案 我有一个servlet,它获取数据然后将其持久化。 这是一个粗略的片段: 我的问题 这样可以通过CDI注入(requestScoped)服务吗?