如何实现servlet得单线程模式

原创 2013年12月03日 11:23:15

如何现实servlet的单线程模式

这个面试题挺经典的,可是网上很多朋友的回答题不达意,所以我在这里就这个问题做一下探讨。

网上朋友的回答是加入<%@ page isThreadSafe=”false”%>这条命令。天啊,我晕!这是什么命令?是jsp的命令啊,怎么会加入到servlet中呢?当然了,jsp的运行实质是servlet机制,这条命令是jsp页面告诉容器编译“我”的时候实现单线程。那我们看看他编译后的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单线程模式?   一看到这个问题就楞了,都搞不懂这道题的真实意思,所以就去网上找资料,在这里总结一下,加深记忆。 1、Servlet多线程及如何处理线程安全...
  • shixhzjy
  • shixhzjy
  • 2013年05月19日 05:59
  • 2088

servlet的生命周期,servlet是单线程还是多线程(基础问题)

Servlet的生命周期有三个阶段: 1.初始化阶段,调用init()方法; 2.响应客户请求阶段,调用service()方法; 3.终止阶段,调用destroy()方法; Servlet初始化阶段:...
  • Future_IT_Daniel
  • Future_IT_Daniel
  • 2016年06月28日 09:33
  • 2841

如何实现servlet的单线程模式

实现servlet的单线程的jsp命令是:    默认值为true  isThreadSafe=false模式表示它是以Singleton模式运行。      该模式implements了接口...
  • ZS5902129
  • ZS5902129
  • 2014年12月26日 14:39
  • 215

如何实现servlet的单线程模式

经典的面试题。 实现servlet的单线程的jsp命令是:    默认值为true  isThreadSafe=false模式表示它是以Singleton模式运行。      该模式...
  • Steven_ssm
  • Steven_ssm
  • 2017年08月05日 20:11
  • 270

如何实现servlet的单线程模式

经典的面试题。 实现servlet的单线程的jsp命令是:    默认值为true  isThreadSafe=false模式表示它是以Singleton模式运行。      该模式...
  • zyx789456123
  • zyx789456123
  • 2015年03月25日 22:00
  • 73

如何实现servlet的单线程模式

这个面试题挺经典的,可是网上很多朋友的回答题不达意,所以我在这里就这个问题做一下探讨。           网上朋友的回答是加入这条命令。天啊,我晕!这是什么命令?是jsp的命令啊,怎么会加入到...
  • suyouchenyuan
  • suyouchenyuan
  • 2015年07月21日 17:57
  • 49

如何现实servlet的单线程模式

这个面试题挺经典的,可是网上很多朋友的回答题不达意,所以我在这里就这个问题做一下探讨。           网上朋友的回答是加入这条命令。天啊,我晕!这是什么命令?是jsp的命令啊,怎么会加入到...
  • dong_pongkk999
  • dong_pongkk999
  • 2014年03月13日 11:09
  • 268

servlet的单线程模式

实现servlet的单线程的jsp命令是: 默认值为true isThreadSafe=false模式表示它是以Singleton模式运行。     该模式implements了接口Sin...
  • lan12334321234
  • lan12334321234
  • 2017年04月11日 11:22
  • 87

如何现实servlet的单线程模式

查询了好多的网上资料都说应该这么解决:这条命令。天啊,我晕!这是什么命令?是jsp的命令啊,怎么会加入到servlet中呢?当然了,jsp的运行实质是servlet机制,这条命令是jsp页面告诉容器编...
  • u011247211
  • u011247211
  • 2013年09月29日 20:03
  • 488

MVC设计模式(jsp提交表单到servlet进行验证)

1:VO类(与数据表进行映射)  package cn.com.mldn.mvc.vo; public class User {  private String userid;  privat...
  • pangqiandou
  • pangqiandou
  • 2016年10月13日 13:02
  • 762
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何实现servlet得单线程模式
举报原因:
原因补充:

(最多只允许输入30个字)