`
zengguo1988
  • 浏览: 279971 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Servlet学习系列资料(六)-------Servlet的线程安全问题

阅读更多

Servlet的线程安全问题

1.      Servlet的线程安全问题

Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行。

这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的Web应用时如果不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误。

Servlet的线程安全问题主要是由于实例变量使用不当而引起的

 

2.解决方法

  a). 实现 SingleThreadModel 接口:  该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题

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

  c). 避免使用实例变量:本实例中的线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。

 

3.总结

对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModelServlet2.4中已不再提倡使用;同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。

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

 

 

个人博客正式上线,欢迎访问

 

分享到:
评论

相关推荐

    servlet线程安全问题

    Servlet 线程安全问题 Servlet 线程安全问题是指在使用 Servlet 编程时,如果不注意多线程安全性问题,可能会导致难以发现的错误。Servlet/JSP 技术由于其多线程运行而具有很高的执行效率,但这也意味着需要非常...

    servlet-2_5-api.zip_servlet-2_5-api.jar

    10. **异步处理**:Servlet 2.5引入了异步处理能力,通过HttpServlet的startAsync()方法,可以在后台线程中执行长时间运行的任务,而不阻塞客户端。 在实际开发中,开发人员会将这个"**servlet-2_5-api.jar**"库...

    servlet-3_1-final.pdf

    此外,规范定义了关于安全性和可移植性的问题,以确保 Servlet 可以在不同厂商的容器之间进行迁移,而不影响其功能和性能。 随着 Java Servlet 规范的演进,从版本 3.1 开始,容器实现了更多的自描述性功能。这意味...

    servlet-api-3.0-alpha-1.jar

    在Servlet 3.0中,Servlet容器支持异步处理,这意味着Servlet可以在不阻塞线程的情况下执行长时间运行的操作。通过调用`HttpServletRequest.startAsync()`方法,开发者可以开启异步处理模式,这样主线程会立即返回...

    PHP/Java Bridge的JavaBridge.jar、php-servlet.jar和php-script.jar

    JavaBridge.jar实现了Servlet接口,使得它能在任何支持Servlet的Java应用服务器上运行,如Tomcat、Jetty等。 2. **php-servlet.jar**: php-servlet.jar是PHP/Java Bridge的另一个关键部分,它是一个Servlet,负责...

    jakarta-servletapi-4-src.zip servlet源码

    通过对jakarta-servletapi-4-src.zip源码的分析,开发者不仅可以加深对Servlet API的理解,还能学习到如何优化Web应用程序的性能、安全性以及用户体验。这是一次深入挖掘Java Web核心技术的宝贵机会,对于任何希望...

    servlet-2_4-fr-spec-doc.rar_doc_servlet 2.4 spec_servlet api_ser

    一个Servlet实例可能服务于多个并发请求,因此开发者需要注意线程安全问题。 8. **错误处理**:Servlet容器可以配置错误页面,用于处理特定HTTP状态码或异常。通过在部署描述符中定义`error-page`元素,可以指定...

    servlet与Struts action线程安全问题分析

    Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...

    servlet-api 各种版本

    Servlet-API是Java Servlet技术的核心部分,它定义了服务器端与客户端之间交互的一系列接口和类。这个压缩包包含了Servlet-API的多个版本,分别是2.2、2.3、2.4、2.5以及3.0。每个版本的发布都带来了新的功能和改进...

    servlet-2.5-mrel-spec.rar

    但这也要求开发者需要考虑线程安全问题。 6. **Filter过滤器**:过滤器允许在请求到达Servlet之前进行预处理,或者在响应返回给客户端之后进行后处理。Servlet 2.5增加了对过滤链的支持,可以有多个过滤器按顺序...

    servlet-api-3.0.jar包

    2. **异步处理**:Servlet 3.0引入了异步Servlet的概念,使得在处理长运行任务时,服务器不再需要为每个请求分配一个单独的线程,从而提高了服务器的并发性能。通过`ServletRequest.startAsync()`方法,开发者可以...

    servlet-3-1-specification.pdf

    Servlet容器提供了Servlet运行的环境,同时管理了Servlet的生命周期和线程安全等问题。 2. Servlet与Servlet容器 Servlet容器(例如Tomcat, Jetty等)负责管理Servlet的生命周期,包括初始化、请求处理、以及销毁等...

    Servlet线程安全问题.docx

    Servlet线程安全问题详解 在Java Web开发中,Servlet是一个重要的组件,用于处理HTTP请求。然而,Servlet在多线程环境下的线程安全问题是一个不容忽视的话题。在Servlet的生命周期中,Tomcat容器会根据需求实例化...

    深入研究Servlet线程安全性问题

    深入研究Servlet线程安全性问题...

    Servlet线程安全的解决方法

    在探讨Servlet线程安全的解决方案之前,我们先来了解一下为何会出现线程安全问题。当多个线程同时访问同一个Servlet时,如果这些线程同时修改了Servlet中的共享资源(例如实例变量),那么就可能会导致数据不一致性...

    深入研究Servlet线程安全性问题.pdf

    ### 深入研究Servlet线程安全性问题 #### 一、引言 Servlet技术作为Java Web开发中的核心组件之一,因其高效性和灵活性被广泛应用于Web应用程序的开发中。Servlet能够处理HTTP请求,并产生相应的响应。它的一个...

    servlet-api-2.5-6.1.9 + jsp-api-2.1

    Servlet API是Java Servlet规范的实现,它定义了服务器端Java应用程序与Web服务器交互的一系列接口和类。Servlet 2.5版本是这一规范的一个里程碑,发布于2006年,是Java EE 5的一部分。在这一版本中,主要包含了以下...

Global site tag (gtag.js) - Google Analytics