servlet线程安全

来源:互联网 发布:中国地缘政治知乎 编辑:程序博客网 时间:2024/06/05 13:32
Servlet的线程安全问题
servlet运行机制:当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类,
当有新的客户端请求该Servlet时,Servlet容器会自动使用线程池等技术来处理客户端的请求,这样就会有线程安全的问题
三种解决方案:
第一种:实现 SingleThreadModel 接口
Servlet中的service方法将不会有两个线程被同时执行(概要)
缺点:会话属性和静态变量仍然可以被多线程的多请求同时访问,即便使用了SingleThreadModel servlet
第二种:同步对共享数据的操作
通过同步块操作来保证线程的安全,使用synchronized 来处理
第三种:避免使用实例变量
对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。
但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,
这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;
同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。
这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,
而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,
要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;
在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。
从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,

所以它们不会影响线程的安全。

连接:http://www.cnblogs.com/gw811/archive/2012/09/07/2674859.html


0 0
原创粉丝点击