Servlet是线程安全的吗?
资料:
(1)servlet的实例变量是线程不安全的,而其JSP也默认是以多线程方式执行(原创):
https://blog.csdn.net/hunkdong/article/details/443430
https://www.cnblogs.com/flywang/p/5483732.html
归纳:
(1)Servlet不是线程安全的,因为它采用多线程方式运行其service方法.也就是说,当多个用户并发访问的时候,可能存在线程交互的问题。
(2)servlet的实例变量是线程不安全的,而其JSP也默认是以多线程方式执行,所以其线程也是不安全的!
如下:
public class SplitPageXmlServlet extends HttpServlet { String pageIndex=request.getParameter("pageIndex"); String pageSize=0=request.getParameter("pageSize"); String recordCount=request.getParameter("recordCount"); public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} }
上面的pageIndex, pageSize, recordCount都是实例变量,它们都是线程不安全的!
(3)解决办法:
要解决servlet线程不安全性,其中一个主要的方法就是取消Servlet的实例变量,变成无状态的Servlet。
另外一种方法是对共享数据进行同步操作。使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段。
(4)总而言之,凡是在线程内生成的数据对象,都是线程安全的。
(5)多线程的优点:
以多线程方式执行可大大降低对系统的 资源需求,提高系统的并发量及响应时间。
(6)springmvc的controller与struts2的action的区别
1. springmvc的请求调度器是单Servlet多线程的,其controller默认是单例的,因为controller是以方法参数来接收请求参数的,也就是在线程内声明并接收请求参数的。
2. struts2的action是存在实例变量的,即是以action的实例变量来接收请求参数的,所以是线程不安全的,故只能在每个线程内部都创建一个action对象,即action是多实例的。