struts2线程安全

2023-10-31

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

解决:就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个实例.

1、Struts1
Struts1是单例模式,也就是所,Web容器(例如:Tomcat)启动的时候,就会实例化一个Action对象,那么所有请求都是用的这个对象。所以当遇到2个请求并发的时候,那么其实他们调用的是同一个类,这个时候当你在Action内部定义属性的时候,就会产生线程同步的问题。
例如:
你在Action定义了一个 int i = 0;
然后在这个Action里面的某一个方法里面对这个i进行操作。当并发的时候就会遇到问题。
所以:我们在用struts1的时候不能在action里面定义属性。要用到只的话只能在方法里面定义。
2、struts2
Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。所以我们可以在Struts2的Action里面去定义属性。但是Struts2由于 Action和普通的Java类没有任何区别(也就是不用像Struts1里面那样去实现一个Struts的接口,有兴趣的朋友可以自己去了解),所以我们可以用Spring去管理Struts2的Action,这个时候我们就要注意了,因为当我们在spring里面去定义bean的时候,spring默认用的是单例模式。所以在这个时候,你就要修改Spring的配置文件---即修改scope为prototype。
为什么struts1中并没有考虑到线程问题,因为所有的代码都是写在execute的方法中,所有变量都是定义在里面,所以没有线程安全问题。
而现在的struts2就不一样了。struts2的action中就像一个POJO一样,定义了很多的类变量。这就有线程安全问题了。。此时,就使用scope=prototype来指定是个原型模式,而不是单例,这样就解决了线程安全问题。每个线程都是一个新的实例。。

但是,线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在编写容易度和性能上会更好些。
我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下:
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类中只使用局部变量,不使用实例变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

struts2线程安全 的相关文章

  • 实测 亚马逊AI 编程助手 Amazon CodeWhisperer(全网最全)

    文章目录 一 CodeWhisperer简介 1 1 CodeWhisperer 是一个重要的生产力助推器 1 2 CodeWhisperer 的实际应用 二 CodeWhisperer安装教程 2 1 IntelliJ IDEA安装Cod
  • Siebel CRM的整体架构及功能模块全面解读!

    第一篇 Siebel CRM概述 一什么是客户关系治理 客户关系治理 CRM 就建立企业与顾客关系 提高企业核心竞争力而言是一套先进的治理思想及技术手段 它通过将人力资源 业务流程与专业技术进行有效的整合 最终为企业涉及到客户或消费者的各个
  • 【消息队列】浅析Kafka的特点及底层运行机制

    Kafka 官方文档 https kafka apache org documentation introduction 一 什么是Kafka Kafka是一种基于发布 订阅模式的分布式消息队列 它是用scala语言实现的 通信基于TCP
  • Matplotlib-Python之学习记录一

    一 Matplotlib库的简述 Matplotlib是一个基于Python编程语言的创建静态 动态和人机交互式数据可视化的综合库 常用于数据分析 数据挖掘及基础的科研绘图等 Matplotlib通常与Pandas Numpy共同使用 二
  • 安装KVM虚拟机与KVM常用命令

    1 查看有无kvm root kvm02 lsmod grep kvm kvm intel 174841 0 kvm 578518 1 kvm intel irqbypass 13503 1 kvm 配置yum源 curl o etc yu
  • Lifting Monocular Events to 3D Human Pose 论文笔记

    一 Introduction 1 提出了一种使用单个事件流来预测人体姿态的方法 2 建立了一个新的 基于事件的人体姿势估计基准的合成数据集Human3 6m dataset 3 大量实验验证基于事件的人体姿势估计的转移学习和预训练方法 二
  • 《机器学习》第二章模型评估与选择 总结

    基本概念 误差 error 学习器的实际预测输出与样本的真实输出之间的差异 训练误差 training error 经验误差 empirical error 学习器在训练集上的误差 泛化误差 generalization error 学习器
  • Android四种Activity的加载模式

    建议首先阅读下面两篇文章 这样才可以更好的理解Activity的加载模式 Android的进程 线程模型 http www cnblogs com ghj1976 archive 2011 04 28 2031586 html 其中对 An
  • 设计模式之UML详解

    文章目录 1 什么是UML 2 UML图之类图 2 1 类 Class 2 2 接口 Interface 2 3 类图中关系 relation 1 泛化 继承 Generalization 2 实现 Realization 4 聚合 Agg
  • Windows 批处理(bat) for循环语句使用教程

    文章目录 for指令基本格式 指令参数 1 参数 d D 遍历文件夹 2 参数 l L 数字序列 3 参数 f F 打印文件内容 3 1 f delims 3 2 f tokens 2 delims 3 3 f skip 1 3 4 f e
  • mybatis 批量插入提升效率

    背景 最近工作中遇到了解析excel 然后批量插入 发现这个插入时间比较长 所以想要进行一些优化 大家可以跳过过程直接看结论 背景作 准备工作 创建一张测试表 CREATE TABLE user id int 11 NOT NULL AUT
  • 【猿人学WEB题目专解】猿人学第16题

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • 亚马逊 s3 boto3 中 Client,Resource和Session 区别。

    boto3 中 Client Resource和Session的不同 boto3 英文官方文档链接 https boto3 amazonaws com v1 documentation api latest guide resources
  • axios post请求get请求对传参的操作

    axios post请求get请求对传参的操作 特别说明 axios get传参 axios post传参 特别说明 以下都是基于 headers Content Type application x www form urlencoded
  • Python JS逆向篇(三)

    Python JS逆向篇 三 逆向z参数 js实现 py实现 实战 接口1 接口2 逆向主题 解析出网址里视频下的m3u8链接 注 文章所涉及内容只做学习参考交流 不做除此之外的任何其它用途 新手入门级 参考B站视频系列教程 https w
  • 有限状态机 python_python——有限状态机

    前言 使用Python 大部分时间花在了处理文本上 在处理文本的时候 如果对有限状态机有所了解的话 处理起来会更加得心应手 可以把文本看成一个流 然后有一个机器对这个流进行操作 这个机器有状态 不同的状态会做出不同的处理 状态会随着处理进行
  • 《代码大全2》阅读笔记09--Chapter 16 Controlling Loops

    Chapter 16 Controlling Loops 控制循环 循环 是一个非正式的术语 用来指代任意一种迭代控制结构 iterative control structure 任一能够导致应用程序反复执 行一段代码的结构 16 1 Se
  • Quartusii 调试工具之In-System Memory Content Editor

    本文主要介绍Quartusii 调试工具中的In System Memory Content Editor 其主要功能就是能实时更改RAM ROM中的数值 同时也可以修改FPGA内部定义的常数值 它是通过JTAG调试接口去完成RAM ROM
  • SQL去重distinct方法解析

    来源 https www cnblogs com lixuefang69 p 10420186 html SQL去重distinct方法解析 一 distinct 含义 distinct用来查询不重复记录的条数 即distinct来返回不重

随机推荐

  • 【HBZ分享】Clickhouse常用命令及SQL语法

    Clickhouse常用命令及SQL语法 建库语句 CREATE DATABASE 库名 例 CREATE DATABASE first clickhouse MergeTree建表语句 create table 库名 表名 字段1 字段2
  • 2023高教社数学建模国赛C题 - 蔬菜类商品的自动定价与补货决策(完整参考论文)

    摘要 商超 超市和零售店 在现代经济中扮演着至关重要的角色 然而 它们在蔬菜商品管理中面临着多重挑战 这些挑战包括如何准确预测销售趋势 合理制定价格策略 以及有效制定补货计划等问题 解决这些问题对于商超来说至关重要 因为它们直接影响着销售收
  • 图片自动标注工具调研

    AIDA https imageannotation nds ox ac uk 8443 AIDA 网页标注 支持圆圈和曲线标注 可导出json文件 Annotorious https annotorious github io demos
  • vivado2013.4和modelsim联合仿真

    vivado2013 4和modelsim联合仿真 Hello Panda 最近在做Zynq的项目 曾经尝试使用ISE PlanAhead XPS SDK组合和Vivado SDK来搭建工程 使用中发现前者及其不方便后者有诸多不稳定 近期得
  • 【202203】必应2022年3月壁纸链接合集

    全部壁纸 https wallpaper ddddavid cn subpages page 220329 html 2022 年 3 月份 https cn bing com th id OHR Shamrocks EN US911125
  • JMeter测试websocket

    在一个网站中 很多数据需要即时更新 比如期货交易类的用户资产 在以前 这种功能的实现一般使用http轮询 即客户端用定时任务每隔一段时间向服务器发送查询请求来获取最新值 这种方式的弊端显而易见 有可能造成数据更新不及时 如果前端轮询频率为5
  • C++【STL】

    文章目录 一 基本概念 1 1 为什么有仿函数 这样做有什么好处呢 1 2 仿函数可作为什么 1 3 仿函数的内部状态 1 3 1 pass by value 1 3 3 pass by reference 1 3 4 for each的回
  • java中的输入输出流概念_java输入输出--I/O流的概念和划分

    理解数据流 数据流 Stream 是一组有顺序的 有起点的 有终点的字节集合 是对输入和输出的总称和抽象 一般地 数据流分为 输入流 InputStream 和输出流 OutputStream 输入流只能读不能写 而输出流只能写不能读 通常
  • Openwrt一条命令把整个路由器搞蹦了

    对于rm rf这条命令以前吃过一次亏了 这次又没有长记性 以前本来想删除某个目录下所有的c文件删掉 但是cd到该目录时少进了一级目录 结果啊把其他人忙活里几天的代码全搞没了 我只想说一下 当某种破坏已经造成 并且破坏没有继续 而你又一时不知
  • 彻底关闭 Win10 系统自动更新【四大步骤】

    Windows 10 的自动更新非常顽固 多用户在网上试了各种关闭win10自动更新的方法 刚开始看着好像是关闭更新了 可没过多久系统就又开始自动更新了 今天笔者就来教大家如何彻底关闭win10自动更新 该方法亲测有效 一 禁用 Windo
  • 声学基础:声级计和声压级参数简介​。在频率轴上两个音高之间的距离称为音程。一个8度音程称为倍频程(Octave)。人耳听觉范围(以20Hz为基频)可分为10个倍频程​

    在正式开始前 请让我们先搞清两个概念 音频和声学 实践中 尤其在中文环境下 很多人容易将两者混为一谈 这里必须说明的是 声学 acoustic 通常研究通过空气等介质传播的声音 而 音频 audio 指的是那些直接在缆线或音频元器件中传导的
  • Java-面向对象之(封装+继承+多态)

    文章目录 一 什么是面向对象 二 类和对象 三 this的作用 1 this 成员变量名字 2 this 成员方法名字 3 this 构造方法名字 4 this的特性 四 封装 1 什么是封装 2 访问权限修饰符 3 五 继承 六 多态 1
  • Check It Again: Progressive Visual Question Answering via Visual Entailment

    最近要做关于VQA的项目 要读paper 这里收集了一些有关于这篇paper的资料 资料 导读 SFFAI 130 视觉问答专题 佀庆一 中国科学院信息工程研究所在读博士 2021 Check it again Progressive Vi
  • 中国大学MOOC课程《程序设计入门——C语言》 期末考试编程题

    1 最简分式 10分 题目内容 分数可以表示为 分子 分母 的形式 编写一个程序 要求用户输入一个分数 然后将其约分为最简分式 最简分式是指分子和分母不具有可以约分的成分了 如6 12可以被约分为1 2 当分子大于分母时 不需要表达为整数又
  • python-dataframe如何计算多条件下的重复次数

    data 次数 1 新建用来统计出现次数的列 并且初始值为1 for index in range 0 len data for index2 in range index 1
  • 数字信号处理:重要知识点整理

    文章目录 0 最重要 DFT和FFT的区别 1 连续时间信号频域分析 2 通过离散时间信号的Z变换表达式X z 直接写出时域离散信号 序列 x n 的方法 3 部分分式法的MATLAB实现 求X z 的部分展开式 4 稳定系统 5 求频响特
  • javaFX安装及使用

    一 javaFX下载 Jdk 从 1 8 开始 jdk 自带 JavaFX 到 Jdk 11 开始 jdk 不再内置 JavaFX 所以如果你使用的是高版本的 jdk 在使用 javaFX 的时候就需要先安装 javaFX 并在 idea
  • 在 Python 中打印没有逗号和括号的列表

    文章目录 使用 sep 打印不带逗号和括号的列表 在 Python 中打印不带括号的列表 使用 sep 打印不带括号的列表 Python 中要打印不带逗号和括号的列表 使用 str join 方法将列表连接成一个字符串 如果列表包含数字 将
  • Java源码分析(一)Integer

    当你掌握Java语言到了一定的阶段 或者说已经对Java的常用类和API都使用的行云流水 你会不会有一些思考 比如 这个类是如何设计的 这个方法是怎么实现的 接下来的一系列文章 我们一起学习下Java的一些常见类的源码 本篇 一起分析下In
  • struts2线程安全

    问题 Struts 2 Action对象为每一个请求产生一个实例 因此没有线程安全问题 Spring的Ioc容器管理的bean默认是单实例的 上一次请求处理的状态信息被保持下来 并影响了下一次的请求 实际上就是Action中的类变量被不同的