Servlet多线程问题

Servlet/JSP默认是以多线程模式执行的,所以在编写代码时需要非常细致地考虑多线程的安全性问题。Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户请求该Servlet时,一般【不会】再实例化该Servlet类,也就是有多个线程使用这个实例。Servlet容器会自动使用线程池等技术支持系统的运行。这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。


无状态Servlet:即不包含域,也没有引用其他类的域。无状态对象是线程安全的。
有状态Servlet:即包含域或引用其他类的域。有状态对象不是线程安全。


要解决线程不安全性,其中一个主要的方法就是取消Servlet的实例变量,变成无状态的Servlet。另一种方法就是对共享数据进行同步操作。使用Synchronized关键字能保证一次只有一个线程可以访问被保护的区段。


Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值