1、servlet是线程安全的吗?
servlet天生就是多线程的,意思是一个请求,就会有一个线程来处理,但是其是否是线程安全的呢?下面通过实验来证明。
编写类:
<span style="font-size:18px;">package com.ht.action;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class TestServlet extends HttpServlet {
private String username;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter writer = null;
try {
writer = resp.getWriter();
username = req.getParameter("name");
System.out.println(this);
System.out.println(Thread.currentThread().getName() + "-->" +username);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
writer.write(username);
writer.flush();
} catch(Exception e) {
e.printStackTrace();
} finally {
writer.close();
}
}
}
</span>
这个类主要获取请求的name变量,然后再打印回浏览器,为了测试,其中让线程睡眠10秒,开启两个浏览器访问,
一个是:http://localhost:8888/testServlet?name=a
另一个是:http://localhost:8888/testServlet?name=b,最后发现两个输出都是b,证明了servlet不是线程安全的。当用户发送请求,容易会实例化servlet,并且只实例化一次,它是单列的,用这个单列来处理所有的请求。
2、struts2是线程安全的吗?
用同样的方法去验证,其结果是,struts2时线程安全的。
每个请求,容器都会生成一个action实例化,所以他是线程安全的。