Servlet线程安全性问题
来源:互联网 发布:一诺网络诈骗 编辑:程序博客网 时间:2024/04/29 20:57
1实现 SingleThreadModel 接口
该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要将前面的Concurrent Test类的类头定义更改为:
…………
}
2、同步对共享数据的操作
使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中的Servlet可以通过同步块操作来保证线程的安全。同步后的代码如下:
…………
Public class Concurrent Test extends HttpServlet { …………
Username = request.getParameter ("username");
Synchronized (this){
Output = response.getWriter ();
Try {
Thread. Sleep (5000);
} Catch (Interrupted Exception e){}
output.println("用户名:"+Username+"<BR>");
}
}
}
3、避免使用实例变量
本实例中的线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
修正上面的Servlet代码,将实例变量改为局部变量实现同样的功能,代码如下:
……
Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse
Response) throws ServletException, IOException {
Print Writer output;
String username;
Response.setContentType ("text/html; charset=gb2312");
……
}
}
对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。
- Servlet线程安全性问题
- Servlet线程安全性问题
- Servlet线程安全性问题
- Servlet线程安全性问题
- Servlet线程安全性问题
- Servlet线程安全性问题
- Servlet线程安全性问题
- servlet线程安全性问题
- Servlet线程安全性问题
- Servlet线程安全性问题
- Servlet线程安全性问题
- servlet线程安全性问题理解
- servlet的线程安全性问题
- Servlet线程安全性问题总结
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- session详解
- 高质量C++摘录
- cookie和session机制之间的区别与联系
- url-pattern配置技巧
- Eclipse技巧
- Servlet线程安全性问题
- 当心XML文件中的非法字符
- 在DELPHI中用线程排序
- C++中函数中参数和返回值都是用户定义类型(这里主要是类的情况时的分析)
- 跑步去江边的收获
- WinSock基本知识
- PHP分词
- 最初的梦想
- 四个有用的过虑器