`

servlet的单线程模式

    博客分类:
  • web
 
阅读更多
实现servlet的单线程的jsp命令是:
<%@ page isThreadSafe=”false”%>


<%@ page isThreadSafe="true|false" %>
默认值为true
isThreadSafe=false模式表示它是以Singleton模式运行。
    该模式implements了接口SingleThreadMode,
    该模式同一时刻只有一个实例,不会出现信息同步与否的概念。
    若多个用户同时访问一个这种模式的页面,
    那么先访问者完全执行完该页面后,后访问者才开始执行。

isThreadSafe=true模式表示它以多线程方式运行。
    该模式的信息同步,需访问同步方法(用synchronized标记的)来实现。
    一般格式如下:
    public synchronized void syncmethod(...){
      while(...) {
        this.wait();
      }
      this.notifyAll();
    }



  那我们看看他编译后的servlet类和以前的servlet有什么不同?没有加入这条指令的页面中servlet类定义是:

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

………………………………//内部实现咱们大可以不看他。
}

而加入这个命令之后的类定义是:

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 SingleThreadModel {

…………………………//同样省略实现细节

}

        我想大家应该很清楚的发现:加入<@page isThreadSafe="false">之后servlet是实现了SingleThreadModel接口的。有兴趣的朋友可以查下相关资料,其实这个接口在servlet2.4之后就废除了。那么为什么废除?实现了这个接口查看代码内容的时候却发现什么方法都没添加,为什么?

       其实这个接口只是一个标识,让容器改变servlet生成策略的。

  默认的,servlet容器是只创建servlet単实例,为请求提供线程池,我们为了能保证servlet的线程安全问题而不在servlet中添加实例属性。

       但是如果一个servlet实现了SingleThreadModel接口那容器在创建实例池,为每个求情分配实例,当用户请求结束时将实例归还实例池。

       这样做真的安全吗?非也!因为每个请求都会分发一个servlet实例,对于同用户下分发的不同的servlet来说很可能用到同一个session中的属性数据,这样当然出现了线程同步的问题,是不安全的!而且不同用户也可能享用同一个context中的数据,也是不安全的。于是在servlet2.4中建议不再使用这样的设置。

  这样一来我们知道:如果非要实现servlet单线程那就要在servlet中实现SingleThreadModel接口,在jsp中添加<@ page isThreadSafe="false">命令。但是这是不被提倡的。

  也有网友疑问:让servlet单线程而多实例本来不是为了线程安全的吗?为什么<@ page isThreadSafe=?>?的答案却是false?

  我觉得这是个误区,这样设置真的是单线程吗?那肯定不是了,其实这个设置只是要容器保证同一时刻只有一个线程能在servlet的service方法中执行,因为默认的容器实例化servlet时时単实例,如果同时只有一个线程去管理这个唯一的servlet实例,那性能将是极其慢的,为了解决这个问题,容器采取了servlet实例池的方式。每个请求一个线程,而一个线程一个servlet。

          因为这种方式并不是线程安全的,所以答案是false。

  终上所述:其实这道题目是指如果让一个servlet实例对应一个线程,而不是一个servlet实例对应多个线程的默认方式。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    servlet多线程

    #### 二、Servlet容器的单实例多线程处理模式 Servlet容器默认采用单实例多线程的方式处理请求,这意味着对于每个Servlet类,容器只会创建一个实例,并让这个实例服务于所有针对该Servlet的请求。这种方式减少了...

    经典面试题(servletjs逻辑题).pdf

    4. **Servlet单线程模式**:默认情况下,Servlet是多线程的,但可以通过在JSP页面中设置`isThreadSafe="false"`来强制实现单线程。 5. **页面间对象传递**:常用的方法有`request`作用域(一次请求),`session`...

    java笔试题

    8. **实现Servlet单线程模式**: 在JSP页面中设置`isThreadSafe`属性为`false`,防止并发访问同一Servlet实例。 9. **页面间对象传递方法**: - `request`:请求范围,仅限于一次请求。 - `session`:会话范围,...

    JAVA WEB编程面试题

    9. **Servlet单线程模式**:可通过实现`SingleThreadModel`接口或在JSP中设置`isThreadSafe="false"`来限制同一时间仅有一个线程访问Servlet。 10. **HTTP的GET和POST请求**:GET请求将数据附加到URL,安全性和私密...

    java面试技术题库

    48. 实现servlet单线程模式,通常在service方法中使用同步锁。 49. JSP和Servlet的关系:JSP是视图,Servlet是控制器,两者共同构建MVC架构。 50. 会话跟踪技术包括cookie、session、URL重写和隐藏字段。 51. ...

    java面试题 最全面的面试题

    55. **servlet单线程模式**:通过单例模式实现,确保只有一个Servlet实例。 56. **对象传递**:页面间对象传递可通过URL、session、cookie、隐藏字段等。 57. **JSP与Servlet关系**:Servlet处理请求,JSP生成响应...

    servlet 模拟

    4. 单例模式:如果Servlet实例不需要为每个请求都创建,可以使用单例模式,并确保所有可能的共享状态都是线程安全的。 5. 无状态Servlet:如果Servlet不需要保持任何状态,那么它天生就是线程安全的,因为没有共享...

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

    ### servlet与Struts action线程安全问题分析 #### 一、引言 在现代Web开发中,servlet和Struts框架被广泛应用于构建高性能、高并发的Web应用程序。然而,由于它们基于Java的多线程环境运行,因此线程安全问题成为...

    JSP/Servlet Java面试逻辑题

    5、如何现实servlet的单线程模式★★ 答:&lt;%@page isThreadSafe=false%&gt; 面试中会遇到! 6、页面间对象传递的方法 答:request,session,application,cookie等 7、JSP和Servlet有哪些相同点和不同点,他们...

    Servlet基础 Servlet基础 Servlet基础 Servlet基础 Servlet基础

    通过`servlet`和`servlet-mapping`元素,我们可以指定Servlet的名称和对应的URL模式。例如,下面的配置创建了一个名为"HelloServlet"的Servlet,它的映射路径为"/HelloServlet": ```xml &lt;servlet&gt; &lt;servlet-name&gt;...

    pushlet_向在线的特定用户发送消息的单线程应用

    在“pushlet_向在线的特定用户发送消息的单线程应用”中,我们关注的是如何使用Pushlet来实现对特定在线用户的即时消息推送,并且整个应用是基于单线程设计的。 首先,我们需要理解单线程的含义。在多用户环境中,...

    Servlet-api setvlet文档

    10. **MVC模式与Servlet**:虽然Servlet主要用于处理请求和响应,但在实际应用中,常常与Model-View-Controller(MVC)设计模式结合,如Spring MVC框架,将业务逻辑、视图渲染和控制逻辑分离。 通过深入学习Servlet...

    Servlet培训课件(中软国际)

    此外,多线程模型在Servlet中也非常重要,因为Servlet通常在一个单独的线程中为每个请求服务,理解线程安全问题和同步机制是必要的。 在J2EE环境中,Servlet常与JavaServer Pages (JSP)一起使用,形成MVC设计模式的...

    servlet-api-3.0.jar包

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

    异步servlet

    在异步模式下,当Servlet容器接收到请求后,会调用Servlet的`doService`或`service`方法,然后在该方法内启动一个异步操作。Servlet可以立即返回控制权给容器,而不用等待任务完成。容器会释放掉用于处理该请求的...

    手工开发Servlet的步骤

    2. **线程安全**:Servlet默认为多线程环境设计,因此需要避免在实例变量中存储状态信息,以免引发线程安全问题。 3. **编码与解码**:处理HTTP请求和响应时,注意字符编码的一致性,避免乱码问题。 4. **资源释放...

    servlet api jar包

    12. **MVC模式支持**:虽然Servlet API本身不强制使用某种设计模式,但它与Model-View-Controller(MVC)模式很好地配合,使得开发者可以将业务逻辑、视图和控制分离,提高代码的可维护性。 13. **版本更新**:从...

    Servlet请求响应的特殊处理.rar

    在实际应用中,Servlet可能会遇到各种特殊的处理情况,这些情况涵盖了错误处理、会话管理、多线程问题、安全性等多个方面。下面,我们将详细探讨Servlet请求响应的特殊处理。 1. **错误处理**: - ` ...

    servlet源代码

    10. **多线程安全**:Servlet容器为每个请求创建一个单独的线程,因此源代码需要确保Servlet实例是线程安全的,避免共享状态导致的问题。 在“servlet_src”压缩包中深入研究这些源代码,将有助于你更全面地理解...

Global site tag (gtag.js) - Google Analytics