论坛首页 入门讨论版 企业应用

Servlet的线程安全问题的困惑。

浏览 411 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2008-03-29
考虑下面的 servlet 代码:


public class MyServlet extends HttpServlet
{
 final static int i=0;
 public void doGet(HttpServletRequest req, HttpServletResponse res)
 {
    private HttpSession session=req.getSession();
    private ServletContext ctx=getServletContext();
    synchronized(ctx)
        {		
         Object obj=ctx.getAttribute();
         // code to alter obj
        }
 }
}


上面代码中的哪些变量是线程安全的?

选择:

  •     * A. i
  •     * B. session
  •     * C. ctx
  •     * D. req
  •     * E. obj
  •     * F. res



IBM 给出的答案是:

正确答案:

    * A、C、D 和 F

说明:

静态变量 i 是线程安全的,因为它是 final(不能被修改),否则它将不是安全的。请求和响应对象的作用域只在请求的生命周期,因此它们也是线程安全的。会话和 ServletContext 对象可以从多个线程访问,同时处理多个请求,因此它们不是线程安全的。但在本例中,同步了 ServletContext 对象,因此它只能由一个线程一次访问。obj 不是线程安全的,因为即使同步了 ServletContext 对象,它的属性也没有同步。它们需要另外进行同步。因此,选项 B 和 E 是不正确的,而选项 A、C、D 和 F 是正确的。

实在是不好理解,太复杂?
   
最后更新时间:2008-03-31
这有什么不好理解的,楼主在疑惑什么?

A、D、F 是明摆着的,不用解释。

其他几个也解释清楚了。

当然我对C有异议,synchronized(ctx) 貌似加了同步,可是如果另外的servlet,不加同步直接访问ctx,MyServlet类能有什么办法?
   
0 请登录后投票
最后更新时间:2008-03-31
什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
   
0 请登录后投票
论坛首页 入门讨论版 企业应用

跳转论坛:
JavaEye推荐