浏览 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
}
}
}
上面代码中的哪些变量是线程安全的? 选择:
IBM 给出的答案是: 正确答案: * A、C、D 和 F 说明: 静态变量 i 是线程安全的,因为它是 final(不能被修改),否则它将不是安全的。请求和响应对象的作用域只在请求的生命周期,因此它们也是线程安全的。会话和 ServletContext 对象可以从多个线程访问,同时处理多个请求,因此它们不是线程安全的。但在本例中,同步了 ServletContext 对象,因此它只能由一个线程一次访问。obj 不是线程安全的,因为即使同步了 ServletContext 对象,它的属性也没有同步。它们需要另外进行同步。因此,选项 B 和 E 是不正确的,而选项 A、C、D 和 F 是正确的。 实在是不好理解,太复杂? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-03-31
这有什么不好理解的,楼主在疑惑什么?
A、D、F 是明摆着的,不用解释。 其他几个也解释清楚了。 当然我对C有异议,synchronized(ctx) 貌似加了同步,可是如果另外的servlet,不加同步直接访问ctx,MyServlet类能有什么办法? |
|
| 返回顶楼 | |
|
最后更新时间:2008-03-31
什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 |
|
| 返回顶楼 | |





