Servet
一、Servlet 是单例吗
不是。
1、你可以用多个 URL 映射同一个 Servlet。这样就会出现多个实例。
2、看看 Servlet 定义:
如果 servlet 不是在分布式环境下(默认),servlet 容器必须使一个 servlet 实例对应一个 servlet 声明。
However, for a servlet implementing the SingleThreadModel(Deprecated) interface, the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instance.
然而,实现了 SingleThreadModel 接口的 Servlet,可以有多个实例。以处理繁重的请求,并且序列化 request 到特定的 servlet 实例。
public interface SingleThreadModel
Ensures that servlets handle only one request at a time.
结论:
虽然 Servlet 在多数情况下只有一个实例。但它并不是单例设计模式,即不是真正的单例。
二、Servlet 为什么是线程不安全的
基于 JVM 对多线程的支持,这样可以提高代码的执行效率。
不需要为每一个请求都要单独创建/销毁 Servlet(执行 init(), desdroy() )。
同一段代码可以在同一时间被多个请求同时执行。
Servlet 是普通的 Java 类,因此没有对其做线程安全的处理。
三、如何保证线程安全?(避免不安全)
但是,
Java 的类是线程安全的,只有在一种情况下:该类没有 instance variables.
即,没有(实例)变量时。
实例变量(instance properties)是声明在类中的变量,而不是声明在方法中的变量。
声明在方法中的变量是线程安全的,因为在执行该方法时,每一个线程都会在 Stack 中创建它们各自的变量。
因此,方法中的变量不存在线程不安全问题。
- public class ExampleServlet extends HttpServlet {
- private Object thisIsNOTThreadSafe;
- protected void doGet(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- // BAD!! Shared among all requests!
- thisIsNOTThreadSafe = request.getParameter("foo");
- // OK, this is thread safe.
- Object threadSafeObj;
- threadSafeObj = request.getParameter("foo");
- }
- }
四、拓展:Struts2 中的 Action 对象是单例吗?
不是。
当请求到来时,Web 容器为每一个请求创建一个 Request 和 Response 对象。
然后再创建一个线程,并把这两个对象的引用指向该线程。
Struts2 中的 Action 对象是 re-created 的,为每一个请求。并绑定到 Request 对象上,
作为 Request 对象的一个属性。这样就不存在线程不安全问题,因为每一个 Request 对象
只绑定一个线程。
注意:不要混淆 Struts DispatcherFilter 和 StrutsAction
Servet的更多相关文章
- SERvet的表单
首先要建立好数据库. 好了,先写好两个静态页面,分别负责登录和注册. 代码清单1:login.jsp(登录页面) <%-- Document : login Created on : 2013- ...
- servet概述
1定义 Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Servl ...
- 第一个servet(用注解),不用web.xml
环境: idea 1.新建模块 2.在蓝色src下新建一个包com.test 3.在包下新建servlet 4.写代码 package com.test; import javax.servlet.S ...
- window servet 2012 r2 配置php服务器环境
绑定:https://jingyan.baidu.com/article/0bc808fc2c6a851bd485b92a.html 配置环境:http://www.jb51.net/article/ ...
- c 网络与套接字socket
我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...
- 高效 Java Web 开发框架 JessMA v3.5.1
JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...
- 高效 Java Web 开发框架 JessMA v3.4.1
JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...
- Libevent初探
Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...
- J2EE学习(2)--何謂容器【良葛格学习笔记搬】
何謂容器 對於Java程式而言,JVM(Java Virtual Machine)是其作業系統,.java編譯為.class檔案,.class對於JVM而言,就是其可執行檔,你的Java程式基本上只認 ...
随机推荐
- Frameset 框架
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.c ...
- webpack提示安装webpack-cli
webpack 安装后提示CLI webpack 4X 后需要安装webpack-cli 请注意需要安装在同一目录 方法: 第一步:npm install -g webpack-cli 第二部: 同步 ...
- CSS面试复习(一):HTML强化
1. HTML常见元素和理解 head类 meta:字符集.base:路径. a[href,target] img[src,alt] table td[colspan,rowspan] form[ta ...
- python 的基础 学习 第八天数据类型的补充 ,集合和深浅copy
1,数据类型的补充: 元组()tuple,如果只有元素,并且没有逗号,此元素是什么数据类型,该表达式就是什么数据类型. tu = ('rwr') print(tu,type(tu)) tu = ('r ...
- windows平台下利用Nginx做负载均衡
1.下载nginx(http://nginx.org/en/download.html)安装包,解压,并使用cmd命令转到nginx.exe所在的目录 2.执行cmd命令start nginx启动ng ...
- day 2 - 逻辑运算
1. 初识编码 最早的'密码本' ascii 涵盖了英文字母大小写,特殊字符,数字. ascii 只能表示256种可能,太少,后来创办了万国码 unicode 16表示一个字符不行,32位表示一个字符 ...
- MySQL基本命令(待更新...)
数据库操作SQL语句 show databases; 表操作SQL语句 数据库权限操作SQL语句 参考链接 :http://www.cnblogs.com/bzys/archive/2013/01/2 ...
- Flask三种导入配置文件的方式
# 配置对象,里面定义需要给 APP 添加的一系列配置 class Config(object): DEBUG = True # 从配置对象中加载配置 app.config.from_object(C ...
- 20165234 2017-2018-2《Java程序设计》课程总结
2017-2018-2<Java程序设计>课程总结 一.作业链接汇总 每周作业链接 预备作业一:我期望的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:Linux安装及学习 第 ...
- 关于Anaconda的环境和包管理
Anaconda相对于原生python解释器具有更好的包管理功能,它有一个env文件夹,里面包含所要管理的所有环境:日常操作时我们可能会使用pytorch.Tensorflow等多个环境,由于每个环境 ...