web应用想要达到完全的线程安全,需要注意哪些地方?

web应用想要达到完全的线程安全,需要注意哪些地方?

关注web安全知识,正好搜到一个前辈在帖子下的答复,现记录下来,希望可以在日后用到:

Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。Servlet/JSP默认是以多线程模式执行的。做到以下三点,以实现线程安全:
1、实现 SingleThreadModel 接口
  该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。如:

          Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
                 …………
          }  

2、同步对共享数据的操作
   使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段.

3、避免使用实例变量
  本实例中的线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
  但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;
  同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;

发布了30 篇原创文章 · 获赞 13 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u013224189/article/details/49562893