文档章节

如何现实servlet的单线程模式?

 零度的魚
发布于 2014/01/01 21:28
字数 815
阅读 402
收藏 7
点赞 0
评论 0

网上朋友的回答是加入<%@ 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实例对应多个线程的默认方式。

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 27
码字总数 2989
作品 0
太仓
Servlet的一些细节--学习笔记

Servlet细节 1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头 2)一个Servlet的url-pattern可以是1个或多个,有二种形式; a).xx b)/xx/ 注意:/不能一起直接使用 3)/和....

知止内明 ⋅ 04/17 ⋅ 0

日常开发方法、工具类 - openhandx common

OpenHandx-common整理了日常开发中可能经常用到的方法、工具类,也是openhandx系列的基础公共类。其中包括:反多线程、JMS连接池、多数据源的数据库连接池、自定义表达式运算、数据模型、树结...

辛巴8 ⋅ 04/17 ⋅ 0

web项目中web.xml的作用

每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。 web.xml文件是用来...

ChinaHYF ⋅ 04/27 ⋅ 0

JSP 学习总结---学习笔记

什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的对象 HttpServletResponse表示服务端到客户端的...

知止内明 ⋅ 04/18 ⋅ 0

JavaWeb开发比较重要的面试题

JavaWeb开发比较重要的面试题 1. 编码转换:怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 答:示例代码如下: String s1=”你好”; String s2=new String(s1.getBytes(“GB2312”...

xj_9264 ⋅ 05/06 ⋅ 0

Servlet创建运行的过程--生命周期以及自动加载

前言 初学者像我这样的,刚开始学的时候一脸懵逼,为什么Servlet可以直接运行,明明没有入口啊 只是重写了Servlet中的方法。然后访问该地址怎么就直接运行了。 所以了解Serlvet的运行过程即生...

codingcoge ⋅ 06/12 ⋅ 0

Java消息中间件的概述与JMS规范

为什么需要使用消息中间件 在介绍消息中间件之前,我们先来看一个故事: 老王的睡前故事: 在很久很久以前,小明隔壁有个姓王的邻居,姑且就叫隔壁老王吧。隔壁老王有个大女儿,名叫王兰花秀...

ZeroOne01 ⋅ 05/25 ⋅ 0

web开发用到的servlet跟filter

Filter是在服务器启动的时候就创建了, servlet是在调用的时候才能创建, 如果用配置web.xml方式把servlet跟Filter关联起来, 那么在访问具体的servlet时候,会先访问对应的Filter 如果不配置web...

HaleyZhang ⋅ 04/19 ⋅ 0

Tomcat,JBoss与JBoss Web

最近接触到应用服务器JBoss,此外JBoss Web与Tomcat也同为web服务器,便查阅资料对三者进行比较,供大家参考。 一、Tomcat Tomcat 服务器是免费开源的Web 应用服务器。支持最新的Servlet 和J...

thinkyoung ⋅ 2014/11/16 ⋅ 0

Java Web(一) Servlet详解!!

一、什么是servlet?     处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西。理解这个的前提是了解一些http协议的东西,并且...

architect刘源源 ⋅ 05/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

Spring JDBC使用方法

普通实现: 1、创建数据表customer。 可以使用任何数据库实现,在项目中要引入相应数据库驱动包并配置相应数据库连接。 2、创建Customer pojo。 Customer类的属性对应数据库的属性,除了为每...

霍淇滨 ⋅ 今天 ⋅ 0

Contos 7 安装Jenkins

Jenkins是一款能提高效率的软件,它能帮你把软件开发过程形成工作流,典型的工作流包括以下几个步骤 开发 提交 编译 测试 发布 有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动...

欧虞山 ⋅ 今天 ⋅ 0

revel

revel install go get github.com/revel/revelgo get github.com/revel/cmd create new app revel new git.oschina.net/zdglf/myapp run app revel run git.oschina.net/zdglf/myapp ot......

zdglf ⋅ 今天 ⋅ 0

49. Group Anagrams - LeetCode

Question 49. Group Anagrams Solution 思路:维护一个map,key是输入数组中的字符串(根据字符排好序) Java实现: public List<List<String>> groupAnagrams(String[] strs) { Map<Strin......

yysue ⋅ 今天 ⋅ 0

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 今天 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 今天 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部