Servlet是线程安全的吗?

资料:

(1)servlet的实例变量是线程不安全的,而其JSP也默认是以多线程方式执行(原创):

https://blog.csdn.net/hunkdong/article/details/443430

(2)springmvc中的controller是单例的

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是多实例的。

转载于:https://www.cnblogs.com/wu-1393180819/p/9868398.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值