日期:2014-05-20  浏览次数:20751 次

关于java多线程的疑问
大家都知道,servlet是单例的,即web容器只对某个servlet创建一次,以后的请求如果请求的是该servlet,则所有请求共用一个servlet实例,于是我想测试一下,servlet在多线程下的表现。以下是个servlet类

public class MServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
   
   
 
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getSession().getId()+","+Thread.currentThread().getId());
}

 
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}

}


地址为http://localhost:8080/shiro-web/ms

我分别打开3个浏览器,敲入以上地址,可奇怪的是
三次打印的thread id都是一样的,
各位高人有谁懂为什么么
另外,在什么情况下或者我怎么操作,才可以看到打印不同的thread id呢

------解决方案--------------------
其实,Web容器应该都会采用线程池,可反复使用池中的线程。你3个浏览器发出的请求都是由线程池中的同一个线程来处理的,所以线程ID是一样的。

如果想看到不同的线程ID,可以加上sleep的代码,休眠一段时间(比切换浏览器并请求的时间长即可),这样Web容器应当会分配不同的线程来处理请求。
------解决方案--------------------
探讨

引用:

难道大家都不好奇么,这个我觉得是个必须清楚的大问题,我们老是说servlet方法是线程不安全的,servlet内不要放置成员变量,但又找不出实际的场景测试,有点搞笑啊

这个实验不就证明了多用户访问不是多线程,即非线程安全了么
不过这里是没有必要多线程