一、Servlet 是单例吗

不是。 
1、你可以用多个 URL 映射同一个 Servlet。这样就会出现多个实例。

2、看看 Servlet 定义:

引用
For a servlet not hosted in a distributed environment (the default), the servlet container must use only one instance per servlet declaration. 
如果 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 中创建它们各自的变量。 
因此,方法中的变量不存在线程不安全问题。

  1. public class ExampleServlet extends HttpServlet {
  2. private Object thisIsNOTThreadSafe;
  3. protected void doGet(HttpServletRequest request,
  4. HttpServletResponse response) throws ServletException, IOException {
  5. // BAD!! Shared among all requests!
  6. thisIsNOTThreadSafe = request.getParameter("foo");
  7. // OK, this is thread safe.
  8. Object threadSafeObj;
  9. threadSafeObj = request.getParameter("foo");
  10. }
  11. }

四、拓展:Struts2 中的 Action 对象是单例吗?

不是。 
当请求到来时,Web 容器为每一个请求创建一个 Request 和 Response 对象。 
然后再创建一个线程,并把这两个对象的引用指向该线程。

Struts2 中的 Action 对象是 re-created 的,为每一个请求。并绑定到 Request 对象上, 
作为 Request 对象的一个属性。这样就不存在线程不安全问题,因为每一个 Request 对象 
只绑定一个线程。

注意:不要混淆 Struts DispatcherFilter 和 StrutsAction

Servet的更多相关文章

  1. SERvet的表单

    首先要建立好数据库. 好了,先写好两个静态页面,分别负责登录和注册. 代码清单1:login.jsp(登录页面) <%-- Document : login Created on : 2013- ...

  2. servet概述

    1定义 Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Servl ...

  3. 第一个servet(用注解),不用web.xml

    环境: idea 1.新建模块 2.在蓝色src下新建一个包com.test 3.在包下新建servlet 4.写代码 package com.test; import javax.servlet.S ...

  4. window servet 2012 r2 配置php服务器环境

    绑定:https://jingyan.baidu.com/article/0bc808fc2c6a851bd485b92a.html 配置环境:http://www.jb51.net/article/ ...

  5. c 网络与套接字socket

    我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...

  6. 高效 Java Web 开发框架 JessMA v3.5.1

    JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...

  7. 高效 Java Web 开发框架 JessMA v3.4.1

    JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...

  8. Libevent初探

    Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...

  9. J2EE学习(2)--何謂容器【良葛格学习笔记搬】

    何謂容器 對於Java程式而言,JVM(Java Virtual Machine)是其作業系統,.java編譯為.class檔案,.class對於JVM而言,就是其可執行檔,你的Java程式基本上只認 ...

随机推荐

  1. asp.net mvc 多文件上传

    @{ ViewBag.Title = "多文件上传测试"; } <h2>多文件上传测试</h2> <form action="/Demo/I ...

  2. 自定义函数hello,并注册到hive源码中并重新编译

    1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...

  3. ES6 基础

    转载自:ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来 ...

  4. Flask三种导入配置文件的方式

    # 配置对象,里面定义需要给 APP 添加的一系列配置 class Config(object): DEBUG = True # 从配置对象中加载配置 app.config.from_object(C ...

  5. Javascript - DOM文档对象模型

    文档对象模型(DOM) DOM(Document Object Model,文档对象模型)是一个通过和JavaScript进行内容交互的APIJavascript和DOM一般经常作为一个整体,因为Ja ...

  6. vue 中通过 ajax 获取数据时,如何避免绑定的数据中出现 property of undefined 错误

    参考链接:https://segmentfault.com/q/1010000008264089?_ea=1597485

  7. CF1139B Chocolates

    题目地址:CF1139B Chocolates 前一个必须要少于后一个,那么模拟+贪心即可 倒序模拟,每次在上次取的个数减一和这次可以取的最多数量之间取min 直到为0(注意不要减到负数) 再就是注意 ...

  8. WC2019 游记

    Day 0 早上奇迹般的六点半起床平常这时候我还没睡呢 早餐在武汉站吃了一碗28的番茄牛肉米线,结果上菜后我把所有非米线的固体(包括番茄和牛肉)全挑出去了 高二大佬:一个愿宰一个愿挨 在高铁上待了四个 ...

  9. Segmentation metrics

    (1)FCN中引入的四种Metrics:

  10. FAT文件系统规范v1.03学习笔记---1.保留区之 Fat32 FSInfo扇区结构和备份启动扇区

    1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...