作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设,我有一个 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/
我是一名优秀的程序员,十分优秀!