java servlet是单例吗_关于java:为什么apache servlet是单例?

本问题已经有最佳答案,请猛点这里访问。

HttpServletRequest request;

HttpServletResponse response;

public void doGet(HttpServletRequest request , HttpServlet response){

this.request = request;

this.response = response;

}

如果此servlet一次收到多个请求会发生什么?

我们遇到了响应不匹配的问题。 这是一个问题吗?

不要这样做。 真。 别。

这使得世界陷入了黑洞

了解servlet的工作原理:stackoverflow.com/questions/3106452/

您的Web应用程序容器仅加载一个servlet实例。

要编写线程安全的servlet,你几乎不应该使用实例变量。将请求和响应设置为实例变量是完全错误的。 servlet的实例不属于单个请求。

如果您需要将请求或响应的元素提供给其他方法,请将它们传递给这些方法。您不需要它们作为实例变量。

尝试编写一个没有实例变量的非平凡servlet; servlet必须在某些时候(即服务)将控制权委托给某事物。你的意思是不使用非线程安全的实例变量。

当然这是一个问题。 servlet是一个单例。相同的servlet实例用于处理对此servlet的所有请求。并且请求当然是同时处理的。这意味着如果你这样做,thread1将使用通常由thread2处理的请求和响应。

根据定义,Servlet不是单身人士。 Servlet API不会将特定Servlet类的创建限制为单个实例。 Container通常会为部署描述符中的每个servlet声明创建一个servlet实例。单例是一种设计模式,它将其类的对象的创建限制为1且仅为1。

它们不是GoF模式意义上的单例,但它们是有效的,因为servlet规范要求容器只为每个servlet声明实例化一个实例。单例不仅仅是GoF设计模式。你曾经使用像Spring或Guice这样的依赖注入框架吗?在这种情况下从未见过单身人士?

是的,我有。我试图与GoFs对单身人士的定义联系起来。并加上1为您的详细说明:)

所以你选择了一个特定的singleton定义,并决定servlet没有遵循这个特定的定义,因此不是单身人士?这就像说免费啤酒不是免费的,因为它甚至没有开源许可证。

引用Servlet规范

"每个请求和响应对象仅在servlet的服务方法范围内有效,或者在过滤器的doFilter方法范围内有效。容器通常是回收的

请求对象以避免请求对象的性能开销

创建。开发人员必须意识到维护对请求对象的引用

不建议在上述范围之外,因为它可能具有不确定性

结果。"

这与OPs问题没有太大关系。如果他在doGet()末尾使实例变量无效,则请求和响应对象的范围不会扩展到服务方法之外,但他仍然会遇到很大问题。

似是而非。但仍然。如果规范保证保存对这些对象的引用的不确定结果,为什么要这样做呢?

它并不保证任何类型。您可以根据需要保存任意数量的引用,只要您不在服务方法范围之外使用这些引用即可。您只需要以线程安全的方式执行此操作。例如,许多框架在ThreadLocal变量中存储对请求的引用。

我学会了,谢谢。实际上,这变成了一个争论,我不想进入。我批评你和我的。感谢您的所有澄清。

我没那样接受它。我只想捍卫自己的观点,就是这样。

发生的事情是,您的servlet立即变为不可重入,并且在第一次由多个客户端同时调用时肯定会失败。你不能这样做。

这肯定会产生问题,任何实例变量都是共享的,因为servlet是单例,因此将覆盖并发请求和响应对象。

这是一个问题,永远不建议将HttpServletRequest request / HttpServletResponse响应声明为实例变量。实际上Servlet正在实现单线程模型,这意味着只创建了一个servlet实例。每个请求都有一个线程。因此,如果它们有很多请求,则thr必须是多个线程,并且每个线程共享相同的servlet实例,这将导致数据不匹配或数据不一致问题。线程将在相同的实例上工作。

单线程模型!= singleton servlet。单线程模型正是模型(没有人使用因为它效率低下),它保证只有一个线程使用给定的servlet。

不建议使用"单线程实现"。它被弃用了。

-1;这个答案没有提供任何价值。其他人已经说过它的部分错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OkHttp的作用_为什么要使用OkHttp?(笔记)

OkHttp的作用 OkHttp is an HTTP client。 如果是HTTP的方式想得到数据,就需要我们在页面上输入网址,如果网址没有问题,就有可能返回对应的String字符串,如果这个地址是返回字符串的话。 OkHttp是在idea代码中,通过调…

java 连接远程服务器_java实现连接远程服务器并执行命令的基本原理

一、所需jar包需要借助Ganymed SSH的jar包: ganymed-ssh2-build210.jar二、实现原理Ganymed SSH-2 java在整个访问过程中担当SSH的客户端,由于Linux系统自带SSH服务,所以可以直接访问Linux系统并执行相关命令,而 Windows系统则需要首先安装S…

SpringMVC接收基本类型和包装类型

先看一个示例: 注意这两个参数都没有加RequestParam注解。 测试: 直接报错。即没有加RequestParam注解,基本数据类型参数是必填的。 再测试: 直接返回null,也就是说包装类型参数,没有加RequestParam注解&…

SpringMVC 【参数绑定详讲、默认支持参数类型、自定义参数绑定、RequestParam 注解】

SpringMVC 第四篇【参数绑定详讲、默认支持参数类型、自定义参数绑定、RequestParam 注解】 参数绑定 我们在 Controller 使用方法参数接收值,就是把 web 端的值给接收到 Controller 中处理,这个过程就叫做参数绑定… 默认支持的参数类型 从上面的用…

MySQL保留字不能作为字段名使用_Table字段不能设为关键字range,range在mysql中是分区,是mysql的关键字

mysql 中Table字段不能设为关键字range,range在mysql中是分区,是mysql的关键字 在设计MySQL字段的时候,无意中使用InOut这个名称作为字段名称,结果前端提交后就是没有写入数据库!但后端没有任何提示,跟踪mySQL日志&…

java+的数组分割符_Java:使用分隔符连接基元数组

小编典典这是我想出的。有几种方法可以执行此操作,它们取决于您使用的工具。使用StringUtils和ArrayUtils来自CommonLang:int[] arr new int[] {1, 2, 3, 4, 5, 6, 7};String result StringUtils.join(ArrayUtils.toObject(arr), " - ");您不…

MySQL中 IS NULL、IS NOT NULL、不等于, 能用上索引吗?

MySQL的WHERE子句中包含 IS NULL、IS NOT NULL、! 这些条件时便不能使用索引查询,只能使用全表扫描。 告诉大家结论: MySQL中决定使不使用某个索引执行查询的依据就是成本够不够小,如果null值很多,还是会用到索引的。 自己做了个…

Java EE 企业网站_基于jsp的企业网站系统-JavaEE实现企业网站系统 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的企业网站系统, 该项目可用各类java课程设计大作业中, 企业网站系统的系统架构分为前后台两部分, 最终实现在线上进行企业网站系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类企业网站系统相关的实体…

MySQL创建联合索引,字段的先后顺序,对查询的影响分析

文章目录前言最左匹配原则为什么会有最左前缀呢?联合索引的存储结构联合索引字段的先后顺序b树可以存储的数据条数总结前言 ​ 对于联合索引我们知道,在使用的时候有一个最左前缀的原则,除了这些呢,比如字段放置的位置&#xff0…

php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php

在php3.0以上版本中,php内置了几乎目前所有的数据库处理函数,包括oracle;在本文中我们通过一个实例来介绍了如何使用这些函数来操作Oracle数据库。PHP提供了2大类API(应用程序接口)来操作Oracle数据库。一个是标准的Oracle处理函数(ORA) 另一个是Oracle …

mysql where过滤条件中and连接的两个条件的顺序不必和建立的联合索引的字段顺序一致_mysql and 顺序_mysql执行过程以及顺序

mysql中and的判断顺序 select * from a join b on 条件一 and 条件二条件一和二都是判断 id 字段, 条件一和条件二哪个先执行? 解析器会自动选择最优的流程执行的 这两个都是平级条件,理论上是没有先后顺序的! 没有顺序&#xff…

php开发电商项目的技术,[项目实战] php电商开发基本功课程 电商后台实战开发视频教程 共6章...

1-1需求分析.mp41-2 数据表建立.mp41-3 前期准备.mp42-1 验证码制作.mp42-2 数据库操作函数封装.mp42-3 登录验证.mp42-4 自动登录功能.mp42-5 后台用户信息管理.mp42-6 分页页码代码封装.mp42-7 后台用户信息分页页码制.mp43-1 添加分类信息.mp43-2 显示分类信息.mp43-3 修改分…

MySQL优化器_MySQL查询优化器

MySQL优化器 MySQL架构图 讲到MySQL,就绕不开他的架构图。MySQL是一个经典的C/S架构。服务器这边分两层:第一层是Server层,第二层是存储引擎。Server层处理主要的业务操作流程,但不关心具体的存储逻辑。存储逻辑由存储引擎层去…

php取商,PHP获取百度关键词排名

PHP获取百度关键词排名$k$_GET[‘k’] ? $_GET[‘k’] : ‘蓝普网络‘;$u$_GET[‘u’] ? $_GET[‘u’] : ‘www.wbphp.cn’;$rn’50’;$url “https://www.baidu.com/s?ieutf-8&wd”.$k.”&rn”.$rn;$ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_se…

MySQL性能优化(一)MySQL中SQL语句是如何执行的?

该篇章将开始整理MySQL的优化,不过开始之前,我们想了解清楚那就是MySQL是怎么执行的。 文章目录1.MySQL驱动2.应用系统数据库连接池3.MySQL数据库连接池4.SQL执行过程4.1.线程监听:监听网络请求中的SQL语句4.2.SQL接口:负责处理接…

php通过ajax下载文件,通过Ajax如何请求下载Execl文件

本篇文章给大家分享的是关于通过Ajax如何请求下载Execl文件,内容很不错,有需要的朋友可以参考一下,希望可以帮助到大家。通过Ajax请求下载Execl 的问题,掉进一个坑里半个多小时,特此来记录一下 。起初 我误以为是后台的…

2023_Spark_实验三十三:配置Standalone模式Spark3.4.2集群

实验目的:掌握Spark Standalone部署模式 实验方法:基于centos7部署Spark standalone模式集群 实验步骤: 一、下载spark软件 下载的时候下载与自己idea里对应版本的spark News | Apache Spark 选择任意一个下载即可 - spark 3.4.1 - spark …

MySQL性能优化(二)InnoDB之日志文件

文章目录1.MySQL日志记录文件1.1.回顾SQL语句的执行1.2.InnoDB内存结构:缓冲池1.3.记录日志:Undo和Redo1.3.1.Undo日志文件:记录数据修改前的值1.3.2.Redo日志文件:记录数据即将修改值1.3.3.Undo和Redo的区别(记录、前…

php正则检查QQ,PHP 正则匹配手机号的QQ号

//匹配手机号码//$mode /\d{3}-\d{8}|\d{4}-\d{7}|\d{11}/;//不匹配以-开头的手机号码//$mode /^((?!-).)*\d{3}-\d{8}|^((?!-).)*\d{4}-\d{7}|^((?!-).)*\d{11}/;//不匹配以 / 开头或结束的手机号码$mode /^((?!\/).)*\d{3}-\d{8}((?!\/).)*$|^((?!\/).)*\d{4}-\d{7}…

java获取单击内容,java – 单击菜单链接时,获取元素不是可点击的异常

我想点击菜单链接但没有运气.它总是显示异常 –Exception in thread “main” org.openqa.selenium.WebDriverException:unknown error: Element is not clickable at point (64, 64). Otherelement would receive the click: <div style”position: absolute; left:0px; to…