日期:2014-05-19  浏览次数:20787 次

这样条件下的HttpServlet是线程安全的吗?
这两天在看关于servlet线程安全问题,提到说它是不安全的,因为多个访问请求面对的是同一个HttpServlet对象,我很快想到了这么一个问题,假设有一个HttpServlet的dopost方法,这个dopost方法内部有一个
StringBuffer result = new StringBuffer();
然后这个result接下来会多次append一些字符串,最后,输出这个字符串给客户端。

如果按照线程不安全的模型理解,这个result是安全的吗?多个线程请求都来调用同一个对象的dopost方法时,dopost内部定义的变量算全局的还是线程局部的,是安全的吗?

如果说这个是安全的,那么在dopost之外,定义的pirvate字段,比如
private String cmd = null;

然后这个cmd在dopost方法中被赋值,然后被使用。假设多个请求访问,会不会发生线程安全问题,比如发生请求A将cmd设置为“我要吃饭”,但是在使用cmd的时候,却发现这个cmd已经被请求B改成了“我要喝水”?

------解决方案--------------------
dopost里面的result变量是局部变量,不存在线程资源的竞争问题
cmd是类的成员变量,存在资源的竞争,多线程下需要考虑线程安全
------解决方案--------------------
第一种情况是安全的,第二种情况是不安全的