Kyl*_*yle 14 java servlets java-ee
如何确保我的java servlet Web应用程序是线程安全的?关于会话变量,类的静态变量或其他任何可能是线程安全问题的问题,我需要做些什么?
Bal*_*usC 21
事实:在webapp的生命周期中,只有一个servlet实例.它在webapp的启动时创建,并在webapp关闭时被销毁.另请参阅此答案以获得粗略的解释.
因此,它在所有请求(线程)之间共享.如果您将请求或会话范围数据分配为实例(或更糟糕的是static)变量,那么它绝对不是线程安全的,因为它随后在应用程序范围内的所有用户(会话)的所有请求(线程)之间共享.您只需将它们指定为方法局部变量以保持它们的线程安全.所以:
public class MyServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
Run Code Online (Sandbox Code Playgroud)
这基本上是在开发具有线程安全性的servlet时需要考虑的全部内容.
然后有session(HttpSession)属性可以在同一个用户的多个请求之间共享,但在现实世界中,您实际上不需要担心同步会话访问.您通常只在那里放置用户特定的数据,例如登录用户,用户特定的偏好,购物篮等等.您只需确保不将纯请求范围数据放在会话范围中.它会反映在同一会话中的多个浏览器窗口/选项卡中.
然后有application(ServletContext)属性在应用程序范围内的所有用户之间共享,但是您通常只放置常量和其他静态数据,例如webapp配置,DAO工厂,下拉列表内容等.这一切都可以通过a来完成ServletContextListener,也可以看一下这个答案的基本例子.您只需确保不将纯请求或会话范围的数据放在应用程序范围中.
Boz*_*zho 16
| 归档时间: |
|
| 查看次数: |
9342 次 |
| 最近记录: |