struts1 和struts2 线程安全

revit二次开发环境搭建(2024版)(小白友好) revit二次开发环境配置,SDK、addin manager和lookup新手友好安装教程 阅读详情

首先我们必须要先了解servlet的生命周期:

服务器只创建每个servlet的单一实例,首次创建servlet时,它的init方法会被调用,因此,init是放置一次性设置代码的地方,之后,针对每个用户的请求都会创建一个线程,该线程调用前面创建的实例方法。多个并发请求一般会导致多个线程同时调用service(线程安全),service方法会依据接受到HTTP请求的类型,调用doXXX方法。最后如果服务器卸载某个servlet就会调用servlet的destroy方法。

 

servlet是否线程安全?

通常情况下,系统只生成servlet的单一实例之后,为每个用户请求建立新的线程。如果很多请求同时到来,那么多个线程可能会并发的访问同一个servlet对象。因此我们必须小心地同步对字段以及全局变量和其它共享数据的访问,因为多个线程可能同时对同一数据进行访问。(多个线程并不共享局部变量)。


解决方法:

原则上,可以让servlet实现singleThreadModel接口,阻止多线程访问

Public class Servlet1 extends HttpServlet implements SingleThreadModel{

……..

}

实现此接口。大多数情况下,系统将所有的请求排队,一次只将一个请求发送给单个servlet实例。但是,服务器也可以创建由多个实例组成的池,同一时间每个实例都能够请求处理,此时我们不需要担心队servlet常规字段(实例变量)的同时访问,但是必须同步对类变量或存储在servlet之外的共享数据的访问,

大部分情况下,SingleThreadModel并不是一个很好的选项。如果servlet被频繁访问,那么同步对servlet的访问对性能造成极大的损害(等待时间)。在servlet等待I/O,数据库访问等其它操作时,服务器不能处理同一servlet的挂起请求。

singleThreadModel的第二个问题来源于,Servlet规范允许服务器使用多个实例来处理请求来替代对单个实例的请求进行排队的方案。只要每个实例同一时间处理一个请求,实例共享的方式就满足规范的要求,但这不是一个好的方案:

当使用非静态实例变量存储共享数据,singleThreadModel会阻止并发的访问,但是每个servlet实例都拥有实例变量的单独副本,数据就不能共享,

使用静态实例变量存储共享数据:singleThreadModel的共享池也就没有任何优点,多个请求依旧会并发的访问静态数据。

对于高流量的servlet,使用明确的代码同步更好一些。

 

以一个简单的例子说明,给出3种方案

String id = “user id =” + userId;

Do something….

userId = userId + 1;

1:减少竞争

Sting id = “user id =” + userId++;这种方案减低了产生不正确答案的可能性,但没有完全消除,在很多情况下,减低错误出现的可能性是一场灾难,问题在测试中更难以发现

2:SingleThreadModel

将servlet做如下修改

public class UserId extends HttpServlet implements SingleThreadModel{

如果服务器是通过排队所有的请求来实现SingleThreadModel,那它能工作,但如果村子大量的并发访问,这种方式会导致性能上的巨大损失。

如果服务器通过产生servlet的多个实例来实现SingleThreadModel。这种方式会完全失败,因为每个实例都拥有自己的userId字段。

3:使用同步

Synchronized(this){

       String id = “user id =” + userId;

Do something….

userId = userId + 1;

 

}

 

 

Struts 1 和 Struts 2 的线程安全

在最近使用struts2的时候,都会看到别人写的action中会加上一个scope("prototype") 
这很是奇怪。为什么要加这个。。 
在struts1中并不会加这个。。而且对于struts1中的action都是单例的。虽然听说Singleton是个反模式,听说有性能问题。但在使用struts1的时候没有去深究,因为大家都这么用,用得很自然。 

在查询资料的时候又看到了很多没有加上scope的问题 
http://blog.youkuaiyun.com/foamflower/archive/2009/07/08/4329989.aspx 
http://elf8848.javaeye.com/blog/356746 
这些都是因为没有加上scope,导致上一次的变量值影响了下一次的请求。 
还有如下问题:也让我想不通。 
引用
《strut2权威指南》中有这么一段: 
线程模式方面的对比:Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题 。 

由于对设计模式不太了解,做了这么之年Struts,一直不知道struts1是单例模式,不知这一点是从哪体现出来的? 
而在开发过程中要怎样注意“线程安全或同步”?struts2从哪体现的“没有线程安全问题”?


那么线程的问题到底体现在哪儿呢? 

在查了些资料后。。明白了些! 
http://hi.baidu.com/platon/blog/item/64a20ff3f96e7fce0b46e031.html 
这文章中讲了最基本的servlet的多线程问题。 
其实servlet本身就是个多线程环境下的单例类。web容器就是这样来处理servlet的。 

通过这文章知道,为什么struts1中并没有考虑到线程问题,因为所有的代码都是写在execute的方法中,所有变量都是定义在里面,所以没有线程安全问题。 

而现在的struts2就不一样了。struts2的action中就像一个POJO一样,定义了很多的类变量。这就有线程安全问题了。。此时,就使用scope=prototype来指定是个原型模式,而不是单例,这样就解决了线程安全问题。每个线程都是一个新的实例。。 

http://hi.baidu.com/niujunkai/blog/item/021964adc130660a4a36d6ab.html 
这文章也说明了问题的关键之处。 
引用
但是,线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在编写容易度和性能上会更好些。 
我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下: 
1)常量始终是线程安全的,因为只存在读操作。 
2)对构造器的访问(new 操作)是线程安全的,因为每次都新建一个实例,不会访问共享的资源。 
3)最重要的是:局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量。 
struts user guide里有: 
Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class. 
译:只使用用局部变量。--编写线程安全的代码最重要的原则就是,在Action类中只使用局部变量,不使用实例变量。



struts2本身就是多实例单线程的,所以可以说 本身就是线程安全的。
struts1则是单实例多线程的,所以必须要注意线程的安全性。
 所以相对来说,struts1 要多使用局部变量,而struts2使用 实例变量则不会产生不安全的结果



数码管动态扫描避坑指南:如何用188芯片实现50Hz无闪烁显示? 本文深入解析188数码管动态扫描技术,提供工业级无闪烁显示方案。通过优化轮询扫描机制、硬件电路设计和软件架构,实现50Hz高刷新率显示,解决亮度不均和鬼影问题,适用于医疗设备和工业控制面板等高要求场景。 阅读详情

相关推荐

PX4固件下VTOL固定翼的3种起飞方式对比:手抛vs弹射vs跑道

本文深度解析PX4固件下VTOL固定翼的三种起飞方式:手抛、弹射与跑道起飞,对比其技术差异与适用场景。通过详细的参数配置和工程实践指南,帮助开发者优化起飞性能,提升无人机在不同环境下的适应性和可靠性。文章特别针对PX4飞控系统的最新特性进行了技术探讨。

weixin_30296405的博客 87

servlet线程安全 servlet多线程 Struts 1 和 Struts 2 的线程安全

首先我们必须要先了解servlet的生命周期: 服务器只创建每个servlet的单一实例,首次创建servlet时,它的init方法会被调用,因此,init是放置一次性设置代码的地方,之后,针对每个用户的请求都会创建一个线程,该线程调用前面创建的实例方法。多个并发请求一般会导致多个线程同时调用service(线程安全),service方法会依据接受到HTTP请求的类型,调用doXXX方法。最后如果服务器卸载某个servlet就会调用servlet的destroy方法。

it_man的专栏 3803

避坑指南:将大华官方Java SDK无缝迁移到SpringBoot 2.x项目的完整流程

本文详细介绍了如何将大华官方Java SDK无缝迁移到SpringBoot 2.x项目,重点解决内存管理、连接池设计和异步处理等核心问题。通过设备连接池化、异步非阻塞接口改造和内存管理优化,实现刷卡、刷脸等认证功能的高效整合,提升Web服务的稳定性和性能。

weixin_42557830的博客 417

struts2线程安全

Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 Spring的Ioc容器管理的bean默认是单实例的,上一次请求处理的状态信息被保持下来,并影响了下一次的请求,实际上就是Action中的类变量被不同的请求读取,出现错误结果 解决:就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个实例. 1、Struts1 St

熊星雨的专栏 1339

Hypermesh静力学仿真分析与模态分析-02

hypermesh中对较复杂实体进行静力学分析和模态分析,包含材料属性添加,载荷设置等等

Look_forward_的博客 6778

VSCode CMake 安装与配置详解

概述 在windows上使用cmake编译C/C++程序时,首先需要CMake,安装gcc/g++编译环境,然后使用VSCode 以及配置下CMakelist.txt。 所需工具: VSCode (需要安装以下插件) C/C++ C++ Intellisense CMake CMake tools CMake Tools Helper CMake MinGW 安装CMake 下载链接:...

Markus 8万+

解决struts1线程安全问题

struts1的Action类是单例模式,存在线程安全问题,应该避免呢? 因为所有针对同一个Action的请求只有一个Action对象处理,因此尽量不要使用成员变量(或者使用synchronized进行同步)。 在execution方法中使用局部变量是最简单的保证线程安全的方法了。也就是说在使用struts1的action时,不要在类中定义属性。 还有一种方法,采用ThreadLoc

Insist 2908

【目标检测】IoU(交并比)详解及代码实现

1. IOU概述        IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 2. IoU计算        IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实

Roaddd的博客 2万+

struts1的线程安全问题

1.struts1的Action是线程不安全的 struts1的Action类是单例模式,存在线程安全问题,应该避免呢? 因为所有针对同一个Action的请求只有一个Action对象处理,即struts用同一个execute()方法来处理多个URI的请求。因此尽量不要使用成员变量(或者使用synchronized进行同步)。在execution方法中使用局部变量是最简单的保证线程安全的方法了。

mafly008的专栏 968

cesium vue2/vue3教程目录导航

以下是本专栏目录导航,送完整项目源码(拒绝单页源码),可以直接运行,全部配置免费视频教程(B站)。

qq_29384639的博客 4317

CANoe/CAPL ,远程邮件通知

CANoe/CAPL ,远程邮件通知

蚂蚁小兵 3036

Struts1与Struts2的区别和对比(深度好文)

本文介绍了Struts2的起源,详细对比了Struts2和Struts1.x的差异,并穿插概述了Struts2框架和请求流程。本文详细介绍了Struts1.x和Struts2两者之间在Action方面、对 Servlet 的依赖方面、输入捕获方面和表达式语言等十几个方面的差别,同时指出Struts2对拦截器与IoC的支持,而在Struts1.x中这些特性是很难想象的。

Rico's Blogs 1万+

【26美赛A题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

本文介绍了2026年美赛数学建模A题的解题思路与方法。A题通常属于连续型系统问题,重点在于构建可解释的机理模型,通过将现实机制转化为动态方程进行仿真预测。文章提出了通用建模路线,包括机理抽象、模型假设、动态建模、参数识别、系统仿真和情景预测六个阶段。专栏将提供从机理到方程的系统建模思路、参数标定方法、Python/Matlab实现代码以及高分论文模板。内容适合参加2026美赛A题、偏重物理/工程建模方向的参赛队伍,旨在提升机理建模能力。后续将更新完整题解和源码。

一键难忘的博客 2009

浅析Struts1和Struts2的Action线程安全问题

【问题描述】最近公司安排我面试Java的FreshMan,面试者一般是工作1年多点的新人(这里我就装老一下,其实我也才工作3年不到),在被问及Struts1和Struts2的Action的线程安全问题的时候,大多是支支吾吾,答不出所以然。所以在这里我整理一下我个人的理解。   【问题答案】 这是由于Servlet的工作原理产生的。我们先来简单回顾一下Servlet的生命周期“初始化->ini

virgoboy2004的专栏 1万+

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

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

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

struts1和struts2中action的线程安全问题

问题: Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 Spring的Ioc容器管理的bean默认是单实例的,上一次请求处理的状态信息被保持下来,并影响了下一次的请求,实际上就是Action中的类变量被不同的请求读取,出现错误结果 解决:就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个实例. 1、Struts

好好工作,努力跳槽 957

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Struts 1 和 Struts 2 的线程安全

    总的来说,Struts1 的 Action 是单例模式,因此开发者必须保证它是线程安全的或是同步的,因为Struts 1中每个Action仅有一个实例来处理所有的请求。     但是在用Struts 1开发时并没有考虑到线程安全问题,这是因为我们在Action中使用的基本都是局部变量,而“局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资

JEECG官方博客 2149

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Servlet、Struts1、Struts2线程安全

对java servlet 单例模式的理解 理解两个问题足以,问题如下: 1、如果不同的2个用户同时对这个网站的不同业务同时发出请求(如注册和登陆),那容器里有几个servlet呢?? 2、不同的用户同时对同一个业务(如注册)发出请求,那这个时候容器里产生的有是几个servlet实例呢? 答案: 引子:一个web容器,可以有多个servlet。 对提交到同

E01014165的专栏 554

Struts1和Struts2的Action线程安全问题

前段时间把工作辞了,这几天忙着找工作,参加面试.在面试的过程中,有面试官会问到Struts1和Struts2的Action线程安全问题,只是知道说Struts1是线程安全的,至于原因就打不上来了,后来查了一下资料,在这里分享一下,也希望自己早日找到满意的工作. 李刚的著作《struts权威指南》中有这么一段: Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一

avinegar的专栏 1590

struts1和struts2线程安全问题

这是由于Servlet的工作原理产生的。我们先来简单回顾一下Servlet的生命周期“初始化->init->service->destroy->卸载”。 这里大家都知道,我们在web.xml里面定义一个servlet的时候,我们可以给他们设置一个“load-on-startup” 的值,如果 Servlet 的 load-on-startup 配置项大于 0,那么在 Context 容器启动

徐刘根的博客 2715

Struts1和Struts2 action的线程安全

转载自 _891229 最终编辑 glaivelee 去面试,问及struts方面的内容:aciton是否thread safe? 俺毫不犹豫的回答:不是 然后问,为什么不是?struts1和struts2那个是线程安全的?俺支吾了半天。也没说个所以然出来。郁闷。 下面是找的另一位同胞的文章: action到底是thread safe还是unsafe呢 我们来看看servlet...

comeontony的博客 221

有关于Struts1 和 Struts 2 的线程安全

总的来说,Struts1 的 Action 是单例模式,因此开发者必须保证它是线程安全的或是同步的,因为Struts 1中每个Action仅有一个实例来处理所有的请求。           但是在用Struts 1开发时并没有考虑到线程安全问题,这是因为我们在Action中使用的基本都是局部变量,而“局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部

周十一的技术博客 597

初谈struts1,struts2以及spring mvc线程安全

首先来看,struts1与struts2,在《struts2权威指南》中有这么一段:struts1 action是单例模式并且必须是线程安全的,因为仅有action的一个实例来处理所有的请求。而strut2 action对面为每一个请求产生一个实例,因为没有线程安全问题。 线程安全,指的是在多线程环境下,一个类在执行某个方法时,对类的内部实例变量的访问安全与否。在struts1中,多个线程并发访

Hu_Robert的专栏 1176

Struts2的action是否为线程安全?Struts1的区别?

Struts2的action是否为线程安全?Struts1的区别?

king的专栏 6725
上一篇: java.lang.IllegalStateException: Cannot forward after response has been committed
下一篇: java设计模式(原型模式)
zljjava
博客等级 码龄15年 155粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值