Servlet线程不安全的解决办法(单实例多线程)



servlet线程安全的解决办法当两个或者多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一个资源的问题,数据可能会变得不一致,所以就很容易导致一些安全性问题。


servlet体系结构是建立在java多线程的机制之上的,它的生命周期由Web容器来负责。


当客户端第一次请求某个Servlet时,servlet容器将会根据web.xml配置文件来实例化这个Servlet类,


当有新的客户端请求该servlet时,一般不会再次实例化该Servlet,也就是有多个线程在同时的去使用当前的Servlet的单实例。


解决办法:


1.同步对共享数据的操作


使用synchronized关键字来保障一次只有一个线程可以去访问被保护的区域


2.避免使用实例变量


线程安全问题还有些是由于实例变量造成的,只要在servlet里面的任何地方都不去使用实例变量,


那么该Servlet就可以保证线程安全。


比较:如果在程序中使用同步来保护要使用的共享的数据,系统的性能大大下降,使得同时处理客户请求的吞吐量下降,而且很多的客户处于阻塞的状态。另外为保证主存内容和线程工作内存中的数据一致性,要频繁的刷新缓存,这也会影响系统的性能,所以在开发中应避免或者最小化servlet中的同步代码


在Servlet中避免使用实例变量是保证servlet线程安全的最佳选择,根据java内存模型可知,方法中的临时变量都是在虚拟机栈上分配空间的,并且每个线程都有自己私有的栈空间,所以在Servlet中应该使用局部变量来消除线程不安全。


总结:


servlet的线程不安全的问题只有在大量的并发访问的时候才会凸显出来,因此在编写Servlet时应该注意。线程安全问题是由于实例变量造成的,因此在Servlet中应该避免去使用实例变量,如果程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,为保证系统的最佳性能,应该同步可用性最小的代码路径。