很明显,servlet可以同时处理多个请求。例如,在服务器(套接字)上建立连接,为了处理此连接,服务器创建一个新线程,该线程调用servlet的doGet并继续执行某些操作。当它正在做某事时另一个请求到来。新线程将使用其他httpRequest和httpResponse实例调用doGet。我使用netbeans和glasfish进行了测试。在servlet的doGet中我放了:
synchronized(obj){
try{
obj.wait(50000)
}catch(InterruptedException e)
{
}
当第一个请求到达时,servlet在50秒之前不再接受任何请求。这意味着对于要捕获的后续请求,前一个线程必须完成其工作并返回以获取另一个请求。为了确保这不是因为同步语句,我在同步之前在某些语句中设置了一个断点但从未到达过。
答案 0 :(得分:1)
Servlet框架通常是多线程的。
我可以想到两种可能的解释:
您的客户端是单线程的;即,在收到第一个请求后,才会发送第二个请求。
不知何故,您只使用一个工作线程配置了GlassFish。
您的测试也可能误导您,以确保问题不是obj
锁定。尝试将其更改为使用本地锁;例如
Object obj = new Object(); // ensure nothing else can see it!!
synchronized (obj) {
try {
obj.wait(50000)
} catch (InterruptedException e) {
}
答案 1 :(得分:0)
通常,如果您没有更改servlet容器中工作线程大小的默认配置,则servlet是多线程的。
在您的情况下,根据您的描述中的结果,我认为obj
是一个共享变量,如类变量,实例变量等。
所以你有一个错误,你不应该在obj1
实例上同步,因为这将使它成为顺序。
您可以更改测试用例,如:
System.out.println(Thread.currentThread());
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
看到结果。