
[英]Cannot open declaration on Eclipse(Source not found) - HttpServlet.class
[英]Is HttpServlet.class running as thread safe?
说,我有一个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对象的作用域为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());
}
注意这里没有非局部变量。 那是相当线程安全的。
不,servlet不是线程安全的。 Servlet不应以这种方式公开任何可变状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.