问题描述
- 关于Servlet多线程的问题
-
Servlet是单实例多线程的,所以我就做了一个小的测试验证这种模式,很简单,class DemoServlet extends HttpServlet {
public void doGet(......) { System.out.println("come in."); Thread.sleep(10 * 1000); }
}
然后在浏览器多个地址栏同时请求这个servlet,发现必须第前面的请求结束,后面的请求才可以进入doGet方法,实在搞不懂为什么,求大神帮解答下!!
另外,关于异步Servlet的也是如此,必须等前面请求的AsyncContext.complete()之后,后面的请求才能进doGet方法,这还算多线程吗?
解决方案
认为这跟servlet无关,下面的应该是可能的情况
1. 服务器的请求允许数已被设置为1(如果你没动过,那么不会是1)。
2. 使用多个浏览器同时请求尝试(怀疑同一session Id被和谐,嗯,有可能是服务器优化的一种表现,不是很好吗)。
3. 使用多个终端同时请求尝试(怀疑同一session Id被和谐)。
4. 你看错了。
解决方案二:
?介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安全的原因,给出了保证Servlet线程安全的三种解决方案,并说明三种方案在实际开发中的取舍。
关键字:Servlet 线程安全 同步 Java内存模型 实例变量
Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Serv......
答案就在这里:servlet 多线程问题
解决方案三:
Servlet是单例线程安全的类,它可以实现多个用户同时访问,但因为它是单例线程安全的,就等于是对象锁,当有人在用这个对像的时候,别人就没有Servlet对象,就不能调用方法,就只能等别人放开这个对象之后,才能调用方法。
解决方案四:
就是说是同步的,,并不是异步的,,,
解决方案五:
Servlet的多线程环境是由Servlet容器处理用户请求的方式决定的,Servlet容器处理每个用户的请求时都启动一个线程去处理的,所有线程共享Servlet实例对象。
Servlet的线程安全与否与Servlet对象中是否有共享变量,以及对共享变量的访问是否有同步处理决定的。
详情参考:http://www.cnblogs.com/itTeacher/archive/2012/11/14/2769822.html
另外CSDN一篇文章也相信讲述了Servlet的安全性的含意:http://blog.csdn.net/yaerfeng/article/details/7385860
解决方案六:
这是同步多线程,一个资源一次只能被一个线程访问!
要同时访问就是异步了
解决方案七:
这是同步多线程,一个资源一次只能被一个线程访问!
要同时访问就是异步了