关于servlet的单例和线程安全问题的思考

Servlet的线程安全问题 文章目录Servlet的线程安全问题引入Servlet的多线程机制如何修复1.实现 SingleThreadModel 接口2.避免使用成员变量3.同步对共享数据的操作思考与小结参考文章 Servlet的线程安全问题 引入 首先看看这样的代码,有什么问题 这里既要求cmd不能包含Calculator又必须要包含Calculator,能做到吗,当然是可以的 Servlet的多线程机制 Servlet实际上是一个单件,当我们第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件或者是 阅读详情

转载:https://www.jianshu.com/p/82a2a4fcd0c9

我们知道在Servlet第一次被调用的时候,Servlet容器会根据web.xml中配置的信息去实例化Servlet,而且这个Servlet只会被实例化一次。当多个请求同时到来时,可能会使用同一个Servlet进行处理,这时候就会涉及到线程安全的问题。

纠结!!!

Servlet的线程安全性?不确定

Servlet是单实例多线程的方式来处理请求,这应该就是造成线程安全的主要原因了。我们知道Servlet本身是无状态的,也就是说Servlet本身是线程安全的,但是为什么网上都说Servlet是线程不安全的呢?可能就是根据一句多个线程会同时访问一个Servlet实例来判断的把。

而Servlet是不是线程安全的,主要是由实现来决定的,如果一个Servlet实现有实例变量,并且会被多线程更改,这时候就不是线程安全的;而如果有实例变量,但是变量又是只读的,这时候不涉及变量的更改,就是线程安全的;而如果一个Servlet实现没有实例变量,都是局部变量,这时候也是线程安全的。

HttpServlet

HttpServlet是Servlet的一个实现,继承自GenericServlet,并且也是我们自定义Servlet所要继承的一个类,HttpServlet是不是线程安全的,也不好说,也得根据在使用过程中不同情况来确定。另外对于Servlet中的属性的使用也会对线程安全产生影响,见下面。

自定义的Servlet

通常我们开发自己的Servlet都是继承HttpServlet,然后重写相关方法,这时候线程安全和不安全都是靠我们自己来决定了,没有实例变量的时候,就是线程安全的;而有实例变量的时候,并且会被改变,这时候就不是线程安全的了,需要使用其他手段保证线程安全。另外对于Servlet中的属性的使用也会对线程安全产生影响,见下面。

如何控制Servlet的线程安全性

变量的线程安全

我们知道当没有实例变量的时候,就基本不存在线程不安全的问题了,所以不使用实例变量是一种方法。

属性的线程安全

  • ServletContext,不是线程安全的,多线程可以同时读写。使用时要注意。
  • HttpSession,不是线程安全的,比如用户打开多个浏览器窗口时候就会产生多个请求针对同一个session的操作。使用时要注意。
  • ServletRequest,线程安全的,它对应着一个request请求,所以说是线程安全的。

SingleThreadModel

我们还可以使用这个接口来创建自己的实现,可以保证线程安全,同一时刻只有一个线程可以执行Servlet实例的service方法,这就成了单线程了,该方式已经被废弃。

常用框架的线程安全性

SpringMVC,我们知道Spring的IOC容器默认管理的bean是单实例的,对于SpringMVC的Controller来说也是单实例的,所以开发的时候需要保证线程安全。

Struts1中的action也是单实例的,使用的时候会有线程安全问题。

Struts2中Action会为每一个请求产生一个实例,所以不存在线程安全问题。

注意:当使用Spring管理Struts2的Action时,需要将Action的scope设置为prototype,因为Spring IOC容器中bean默认是单例的。

DispatcherServlet的线程安全性

在应用启动的时候,就会根据web.xml中配置的有关Spring和SpringMVC的配置启动初始化,对于SpringMVC初始化的是DispatcherServlet,对于Servlet初始化只会进行一次,并且只有一个实例,所以DispatcherServlet只会存在一个。

但是当多线程同时访问DispatcherServlet的时候是线程安全的,因为DispatcherServlet中的内部属性都不会影响线程安全,所以DispatcherServlet可以忽略线程安全的问题。

虽然DispatcherServlet可以认为是线程安全的,但是SpringMVC中的Controller不是。Controller也是单例的,每个请求对应一个Controller中的方法,方法如果没有使用实例变量,可以认为是线程安全的,但是如果有实例变量就要考虑线程安全的问题了。



作者:加大装益达
链接:https://www.jianshu.com/p/82a2a4fcd0c9
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

从零构建XVC协议栈:FPGA+W5300的跨界调试架构实战 本文详细介绍了如何从零构建XVC协议栈,通过FPGA与W5300以太网控制器的创新组合实现跨界调试架构。重点解析了JTAG时序逆向、TCP/IP协议栈集成与XVC协议实现,提供了硬件设计优化和性能加速技术,为嵌入式开发者和FPGA工程师提供实用的远程调试解决方案。 阅读详情

相关推荐

告别Vysor!用Scrcpy在Mac上无线投屏安卓手机(附魅族16th闪退修复实战)

本文详细介绍了如何在Mac上配置和使用开源投屏工具Scrcpy,实现安卓手机无线投屏的高效解决方案。从基础环境准备到高级功能调优,包括无线连接配置、输入控制增强、多设备管理和性能优化等实用技巧,特别针对魅族16th等机型的闪退问题提供了修复方案,帮助用户彻底告别Vysor等商业软件。

weixin_28712661的博客 395

关于Servlet线程安全性和DispatcherServlet的线程安全性的解析

我们知道在Servlet第一次被调用的时候,Servlet容器会根据web.xml中配置的信息去实例化Servlet,而且这个Servlet只会被实例化一次。当多个请求同时到来时,可能会使用同一个Servlet进行处理,这时候就会涉及到线程安全的问题。 纠结!!! Servlet的线程安全性?...

chijunmei7041的博客 881

Elsevier期刊LaTeX双栏模板(cas-dc)实战:从Overleaf配置到投稿全流程

本文详细介绍了Elsevier期刊LaTeX双栏模板(cas-dc)在Overleaf平台上的配置与使用全流程,包括模板结构解析、标题与作者信息规范、摘要与关键词特殊格式、正文写作技巧、参考文献管理以及投稿前检查清单。特别针对Elsevier期刊投稿需求,提供了从模板安装到最终投稿的实用指南,帮助研究者高效完成论文排版工作。

weixin_28455801的博客 1323

SpringMVC源码分析之DispatcherServlet的执行流程

SpringMVC源码分析之DispatcherServlet 1.DispatcherServlet的初始化 ​ 前面一片文章大概的讲述了DispatcherServlet的基本作用,也知道它其实就是一个Servlet,下面详细分析DispatcherServlet。 ​ Web容器初始化后,会为每个Servlet创建对象,并加载其上下文环境。我们都知道,在Tomcat容器中,维护了一个线程池,...

qq_38238296的博客 944

MATLAB 设置legend加标题

x1 = linspace(0,5); y1 = sin(x1/2); plot(x1,y1) hold on x2 = [0 1 2 3 4 5]; y2 = [0.2 0.3 0.6 1 0.7 0.6]; scatter(x2,y2,'filled') hold off legend({'sin(x/2)','2016'},'Location','northwest','Orientation','horizontal')%水平 legend添加标题 lgd = legend; lgd.Fon

早起CaiCai的学习空间 4713

Ubuntu docker镜像中下载安装 DPABI(DPARSF)

在Ubuntu服务器的docker镜像中用MATLAB运行DPABI(以及使用DPARSF的功能)。

Pandako's Blog 1722

tomact高并发&Servlet线程处理

Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题。   Serv

B10090120的专栏 6585

YOLOv12改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov12精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 684

Spring提供的DispatcherServlet是怎么调用我们的Controller里的业务接口的?

前言 在分析问题前,先看下Tomcat的架构图,有助于后面看代码: 这里可以看出一个Tomcat就是一个Server,一个Server下会有多个Service,Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳,不负责具体功能),而Container(也叫engine)下又有多个Host,每个Host下对应多个Context,Context下才是我们的Servlet,Tomcat为了使整个架构灵

肆頭的博客 1499

C# 的 Dapper 库高级进阶:刨根问底的深度解析

通过今天的探索,我们了解了 Dapper 的一些高级功能,包括如何处理复杂的查询、执行批量操作以及如何优化性能。希望这篇深入浅出的文章能帮助你在实际项目中更好地运用 Dapper!🎈好了,小伙伴们,今天的分享就到这里啦!如果你有任何疑问或者想要分享自己的经验,请在评论区留言。我们下次再见!👋上述示例代码仅供参考,实际使用时请根据项目需求进行适当调整。✨Dapper 官方文档Dapper 性能优化指南Dapper 动态参数使用来同时执行多个查询。利用Execute和Query方法来简化 SQL 调用。

java专栏 813

对称式目镜设计实例

对称式目镜设计实例

weixin_72050316的博客 1163

JavaWeb开发之Servlet中的线程问题及使用ServletConfig对象操作Servlet中的参数

Servlet的一些细节(7)—线程安全 当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。   如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其serv

lijizh1013的专栏 2871

基于Simulink的超级电容快速响应特性建模与仿真

本文介绍了基于Simulink的超级电容快速响应特性建模与仿真方法。主要内容包括:超级电容的工作原理、一阶RC等效电路模型及其动态电压方程;通过Simulink搭建超级电容模型的两种方法(Simscape Electrical推荐方案和基础模块透明教学方案);仿真100A×100ms放电脉冲下的电压响应特性,并与锂电池进行动态对比;分析超级电容在混合储能系统中的功率分配优势。文章还提供了工程实践要点和扩展方向,如电压均衡、温度影响评估以及与DC-DC变换器集成等。通过建模实践,验证了超级电容在毫秒级响应、高

xiaoheshang_123的博客 98

论servlet的线程安全问题

     最近公司大牛在电话面试某位来我们公司面试的员工的时候问了那么一些问题,引起了本人的深思,因为自己也不会。 我们公司大牛电话问:看你简历上写的对servlet比较熟悉,那么请问你知道servlet是线程安全的还是线程不安全的呢。 被面试的人回答:线程不安全的。 大牛问:为啥是线程不安全的呢。 被面试者回答:提交效率,如果是线程安全的,那么效率低下(比如说加锁效率就比较低下) 大牛...

远方的博客 482

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Servlet是不是线程安全的?

Servlet是不是线程安全的?

m0_73727512的博客 183

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

闭关修炼(二十一)Servlet生命周期、service方法源码分析、线程安全问题

文章目录Servlet的生命周期Servlet简单源码分析Servlet多线程安全问题 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 Servlet的生命周期 init–初始化 service–do、post destroy–销毁 例子: public class DemoServlet extends HttpServlet { @Override

qq_19841133的博客 343

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何开发线程安全的Servlet

http://www.blogjava.net/mixer-a/archive/2012/05/12/377958.html     先说明几个概念:工作者线程Work Thread:执行代码的一组线程调度线程Dispatcher Thread:每个线程都具有分配给它的线程优先级,线程是根据优先级调度执行的Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服...

雪花片片飞满天 197

什么叫线程安全?servlet是线程安全吗?

1、什么叫线程安全?servlet是线程安全吗? 线程安全 就是多线程在运行期间不会产生不符合常规的数据。 同样在多线程访问同一代码,不会产生不确定的结果 线程安全首先呢他的是多线程,至少是2个。因为一个线程那肯定是线程安全的。就你自己一个线程执行没有人给你争用资源。你是在串行执行,不会出现不确定结果。 如果有多个线程 那问题可就多了。比如一个 ArrayList 类,在添加一个元素的时候,...

heima201907的博客 566

ServletContext,session,servlet的线程安全问题

  ServletContext线程安全如何解决?  使用synchronized (this) {}代码块效率没有保障 我的思路是 在这个对象中存入Vector集合 把真正的值放入这个集合   因为Vector集合是线程安全的 我感觉这样也能保证ServletContext线程安全  不知道 我的思路是否正确  还有没有别的方法?...

Happy learning 357

Servlet技术详解

Servlet,全称为Server Applet,是Java Servlet的简称,是用Java编写的服务器端程序。Servlet是Java Web开发中的核心技术之一,用于处理客户端发送的请求并生成相应的响应。在深入了解Servlet之前,我们需要明确其定义、技术难点、在Web应用中的角色,以及如何在面试中展现对其的深入理解。但可以在回答中提及常见的Servlet使用场景和代码结构,如doGet()和doPost()方法的实现、请求参数的获取和响应的生成等。四、Servlet在Web应用中的角色。

1210

美团Java研发岗二面:什么叫线程安全?servlet是线程安全吗?

前言: 再过一个月的时间就是金三银四了,相信不少的朋友对于已经做好了充足的准备来应对这一次春招,小编对大家也没有太多的建议和帮助,分享一些你们面试上面可以用得到的一些面试题。今天主要给大家分享多线程(线程安全)方面的面试题,看到文章的小伙伴一定要看到后面哦,有海量的面试题分享给大家哟。 1、什么叫线程安全?servlet是线程安全吗? 线程安全就是多线程在运行期间不会产生不符合常规的数据。 同样在多线程访问同一代码,不会产生不确定的结果 线程安全首先呢他的是多线程,至少是2个。因为一个线程那肯定.

文章中资料均可获取,有需要请添加yunduoa2019即可 121

线程安全实例分析

线程1、2均执行方法内的代码,线程1执行get(“key”) == null,还未执行完,线程发生上下文切换轮到线程2执行,线程2也执行到此处得到的get(“key”) == null,线程2发现为null后put(“key”, v2),完成后又切换为线程1,线程1又put(“key”, v1)。② Connection也是线程安全的,Connection属于方法内的局部变量,即使有多个线程访问,线程1创建的为Connection1而线程2创建的为Connection2,两者独立互不干扰。

m0_56188609的博客 682

【Java并发编程】变量的线程安全分析

变量的线程安全分析

小新的博客 2675
上一篇: 一篇关于线程并发的简单案例
下一篇: 通过验证码的设计来深入理解web项目中jsp与servlet的不同
whathellll
博客等级 码龄11年 23粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值