Java Web笔记 – Servlet多线程同步问题及其解决方法

多用户并发访问Servlet与线程同步 Servlet容器为了响应多个用户同时访问一个Servlet的HTTP请求,通常会为每个请求分配一个工作线程,这些工作线程并发执行同一个Servlet的service()方法。此时可能发生多线程对同一数据进行访问的情况。 [code="java"] public class Hello extends HttpServlet{ private String name; pub... 阅读详情
ServletContext和Web应用关系:

当servlet容器启动Web应用,并为每个Web应用创建唯一的ServletContext对象。可以吧ServletContext看成一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,提供了读取或设置共享数据的方法:

setAttribute(String name, Object object); getAttribute(String name);

在Servlet中获取application(ServletContext):

ServletContext context = req.getSession().getServletContext();
1、Servlet中的多线程问题:

由于Servlet/JSP默认是以多线程模式执行的,但是Servlet是单实例的,所以,在编写代码时需要考虑多线程的并发同步问题。例如,当有多个用户同时访问某个Servlet时,会访问这个唯一的Servlet实例中的成员变量,如果对成员变量进行赋值,就会导致数据不一致。

2、举例说明:

下面这个Servlet当有多个用户同时访问时,由于Servlet是单实例的,在10秒钟内有两次访问时,这是共享的username成员就赋值为后者传递过来的username,当两者返回给客户端数据时,如果通过以下方式获取username,则都是得到后者传递的username的值:

request.getAttribute("username");

但是如果从request请求(每个用户对应一个请求,两个请求互不干扰)范围内获取username则得到的是各自传递给该Servlet的值:

request.getParameter("username");
public class ThreadServlet extends HttpServlet {

    private String username;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        this.username = req.getParameter("username");
        try{
            Thread.sleep(10000);
        } catch(Exception e){
            e.printStackTrace();
        }
        req.setAttribute("username", username);
        req.getRequestDispatcher("result.jsp").forward(req, resp);
    }
}

为了解决上面的问题,可以把成员变量username变为 doGet的局部变量。

3、解决方法:
a、很少使用成员变量,一般使用局部变量。
b、或者使用同步代码块
c、实现javax.servlet.SingleThreadModel,使得Servlet实例以单线程方式运行,即是同一时刻只有一个线程执行Servlet的service()方法。
详解Spring框架下向异步线程传递HttpServletRequest参数的坑 主要介绍了详解Spring框架下向异步线程传递HttpServletRequest参数的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

相关推荐

S32K3基于EB配置GPT触发WDG的实战解析

本文详细解析了S32K3 MCU基于EB tresos工具配置GPT定时器触发看门狗(WDG)的实战方法。通过分析协同工作机制、MCAL配置步骤及代码实现,帮助开发者构建可靠的硬件监控系统,提升汽车电子系统的安全性与实时性。

f9g0h的博客 205

Servlet 单例多线程

Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例); 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的&l...

weixin_33785108的博客 591

OpenFOAM-v2006重叠网格挖洞问题实战:如何手动修复overset代码中的边缘识别缺陷

本文深入探讨了OpenFOAM-v2006中重叠网格挖洞问题的实战解决方案,重点修复overset代码中的边缘识别缺陷。通过逆向工程解析挖洞决策机制,设计最小侵入式的函数override方案,并建立多级验证体系,有效解决了网格挖洞区域覆盖不全的问题,提升了计算流体动力学模拟的准确性和可靠性。

weixin_29216049的博客 433

Servlet的多线程并发问题

3)如果找到相同名称的servlet配置,则取出对应的servlet配置信息中的servlet-class内容(zzuli.edu.cn.Servlet),然后通过servlet-class里的内容,反射构造Servlet的对象,调用Servlet对象里面的方法。因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。通过构造函数来证明,当多次请求(访问)servlet时,如果构造函数只被执行一次,说明servlet是单例的。

QQ1057081261的专栏 412

IP白名单校验

支持格式: 1、127.0.0.1 // 指定固定IP 2、127.0.0.1-127.0.0.128 // 可使用“-”来表示一个IP区间,支持跨IP段(一般不会出现这种情况,跨IP段则配置多个规则) 3、127.0.* // 2~4位IP段可...

2200

手把手教你离线部署Jupyter Notebook及高效插件配置

本文详细介绍了如何在离线环境中部署Jupyter Notebook及配置高效插件,包括离线安装步骤、依赖管理、核心扩展安装及常见问题排查。特别针对金融、科研等封闭网络场景,提供完整的whls包和requirements.txt解决方案,帮助开发者和数据分析师突破网络限制,提升工作效率。

weixin_28839549的博客 584

[javaEE] 关于servlet多并发访问的一些解决方案收集

javaee servlet 多并发 问题探讨

m0_46987924的博客 629

进阶06:C#连接TwinCAT 3使用ADS通讯

本文介绍了使用C#通过ADS协议与倍福TwinCAT3 PLC通讯的实现方法。主要内容包括:1)在两台电脑上安装TwinCAT3开发环境并建立网络连接;2)在TwinCAT中定义变量和结构体;3)使用C# Winform开发界面,通过TwinCAT.Ads.dll实现读写功能;4)实现主动读取和通知两种数据获取方式。详细说明了连接建立、变量定义、读写操作及事件通知的实现代码。该方案实现了对PLC寄存器数据的实时监控和操作,为工业控制系统的开发提供了参考。

weixin_38637405的博客 3690

线程间共享 部分变量 Spring框架下向异步线程传递HttpServletRequest参数

参考 https://www.jianshu.com/p/6bf1adb775e0 https://blog.youkuaiyun.com/kid551/article/details/88703414 需求场景, 当前请求会话中任意位置获取到当前的请求和会话数据 以下方数据举例 HttpSession session, HttpServletRequest request , HttpServletResponse response 解决方法:使用ThreadLocal 存储 定义工具类暂时存储每一个ThreadL

weixin_44692699的博客 2405

15.1-缓存调试解析

摘要:DSU-120提供L3缓存和监听过滤器(SF)RAM的调试功能,通过CLUSTERCDBG寄存器控制访问。该功能需在集群ON电源模式下使用,且需确保单核访问。寄存器位字段根据读写操作不同,可配置WAY、RAM类型等参数。数据读取分为监听过滤器RAM、标签RAM、数据RAM及MTE标签四种类型,各有特定的位字段解释。配置参数包括切片ID宽度、标签索引宽度等,随缓存大小变化。

baron-周贺贺-代码改变世界ctw 112

GStreamer中h264parse元素

h264parse是 GStreamer 中处理 H.264 视频流的关键元素,主要负责解析和准备 H.264 流以便后续处理。

深之JohnChen的专栏 1029

Servlet基础实验--Java Web

如何实现第一个Servlet程序 1、按要求设计一个Servlet01类。 (1)创建Javaweb工程chapter03,创建包路径cn.itcast.servlet。 创建Dynamic Web Project命名为chapter03,在src目录下创建包cn.itcast.servlet,如图1.1所示。 --------------------图1.1 – 创建类、包 (2)自定义Servlet01类继承GenericServlet类,实现service()方法,在service()方法中获取输

qq_45614506的博客 6803

使用Verilog实现QR分解——嵌入式 [设计与代码]

通过Verilog的硬件描述语言,我们可以将QR分解算法实现为硬件电路,并在嵌入式系统中高效地运行。本文将介绍如何使用Verilog设计并实现QR分解算法,该算法用于将一个矩阵分解为正交矩阵Q和上三角矩阵R。具体而言,QR分解通过对矩阵的列进行正交化处理,得到正交矩阵Q,并将对应的正交化结果存储在上三角矩阵R中。该算法通过将矩阵分解为两个部分,正交矩阵Q和上三角矩阵R,实现了对矩阵的分解和变换。模块,该模块接收待分解矩阵A,并输出正交矩阵Q和上三角矩阵R。下面给出了使用Verilog实现QR分解的源代码。

CodeMaven的博客 621

Servlet多线程同步问题及其解决方法

Java Web笔记 – Servlet多线程同步问题及其解决方法 1、Servlet中的多线程问题:2、举例说明:3、解决方法: ServletContext和Web应用关系: 当servlet容器启动Web应用,并为每个Web应用创建唯一的ServletContext对象。可以吧ServletContext看成一个Web应用的服务器端组件的共享内存。在Serv

liang5603的专栏 661

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

servlet运行出现HTTP Status 404 – 未找到的解决方案

萌新一枚 大致是关于web.xml的配置问题 因为本人是萌新,所以在接触servlet时候有很多问题。 这次讲的是已经解决的一个。 刚开始的时候总是显示500(这是我的servlet没有抛出异常导致的,注意: doGet()和doPost()需要重写。(抛出io和servlet异常) protected void doGet(HttpServletRequest req,HttpServletR...

weixin_45239414的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java Web笔记 – Servlet使用笔记

ServletContext和Web应用关系: 当servlet容器启动Web应用,并为每个Web应用创建唯一的ServletContext对象。可以吧ServletContext看成一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,提供了读取或设置共享数据的方法: setAttribute(String name, Object object)

dongxiaobin924的专栏 384

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java servlet 返回404_java – 尝试运行servlet时出现HTTP状态404错误

参见英文答案 > Servlet returns “HTTP Status 404 The requested resource (/servlet) is not available”6个我有一个问题,我正在尝试运行我的简单servlet,Hello.java.我在eclipse中创建它,然后将文件放在webapps ...

weixin_42298646的博客 2782

Java中的Servlet详解

Servlet: server applet 概念:运行在服务器端的小程序 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。 Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。它是作为来自

Rocky balboa 3695

java servlet 返回 web_html – Servlet返回“HTTP状态404请求的资源(/ servlet)不可用”

将servlet类放在包中首先,将servlet类放在Java包中。您应该总是将公开的可重用的Java类放在包中,否则它们对于包中的类(例如服务器本身)是不可见的。这样,您可以消除潜在的环境特定问题。无包servlet仅在特定的Tomcat JDK组合中工作,这不应该依赖于。在“纯”IDE项目的情况下,类需要放置在其“Java资源”文件夹中的包结构中,因此不是“WebContent”,这是用于We...

weixin_36176188的博客 3486

Servlet概述及其基本运用

Servlet: server applet 概念:运行在服务器端的小程序 Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。 将来我们自定义一个类,实现Servlet接口,复写方法。 快速入门: 创建JavaEE项目 定义一个类,实现Servlet接口 public class ServletDemo1 implements Servlet 实现接口中的抽象方法 配置Servlet 在web.xml中配置: <servl

weixin_43840862的博客 241

servlet和java区别_java – servlet和Web服务之间的区别

Web服务是一种使用REST编程范例或SOAP协议为其客户端提供服务方法以进行通信的服务。有几种方法来实现Web服务。编写Web服务的最简单的方法是编写一个类并使用javax.jws中的@WebService和@WebMethod注释进行注释,然后从主方法中启动它:Endpoint.publish("http://localhost:8089/myservice", new MyWebServic...

weixin_30985047的博客 354

java web 基于servlet及MVC的学习小结

1.介绍jsp: 虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSP Parser)转换成Servlet代码,然后Servlet代码被Java编译器编译成 .class 字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的

1029

servlet笔记

Servlet笔记 1、servlet基本结构 2、request.getParameter request.getParameter(String name) 返回参数name对应的参数值 request.getParameterNames() 返回一个Enumeration对象,包含所有参数名 request.getParameterValues(String Name)返回一个E...

lizzzer的博客 204

java web笔记

java web开发笔记

lllwwyy的博客 514

java Web servlet 基础概念

文章目录1、Hello ServletServlet的特点2、Servlet实例对象的生命周期 1、Hello Servlet Servlet是一种用于扩展服务器功能的服务器端组件技术,用于实现动态网页编程 因为Servlet接口不在JavaSE中,所以需要引入servlet-api依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api&

persistence_PSH的博客 164
上一篇: 引用 JAVA EL表达式详细介绍使用手册
下一篇: Java Web笔记 – Servlet技术介绍 生命周期 核心API 类方法调用顺序
zi_jun
博客等级 码龄18年 109粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值