struts1和struts2的线程安全问题

问题描述

我在struts2权威指南中看到介绍struts1与struts2的区别的时候说struts1是线程安全的。网上又有许多人说struts1是非线程安全的!我这个地方有底迷糊了,请高手来说一下,struts1和struts2到底是线程安全的还是非线程安全的,麻烦说下各位大虾是怎么分析的。谢谢

解决方案

解决方案二:
Struts2的Action设计就不像Struts1的Action或者Servlet那样是单实例了。Struts2的Action的设计哲学是每次请求来了,都创建一个实例了。因此,其Action中可以拥有成员变量。而Struts1Action或者Servlet都是单实例的,因此在他们当中使用成员变量的话就会产生线程安全问题。若将Struts2的Action交给Spring管理,就需要Spring配置时需要配置成prototype模式,否则Spring默认会是单实例的。如果是单实例的话,那Action中的成员变量就成为多线程共享变量了,会产生不正确的结果。

转自火龙果大大的回答.原帖链接
解决方案三:
该回复于2011-02-15 10:27:52被版主删除
解决方案四:
1楼说的正确
解决方案五:
struts1实际上就是Servlet的封装,而Servlet在web容器中都是单例,自然当多线程请求访问时,相应变量就可能被占用、共享。struts2是居于webwork设计的,采用拦截的方式push数据,具体更多的可上网了解

时间: 2024-08-06 17:14:04

struts1和struts2的线程安全问题的相关文章

servlet、struts1和struts2的线程安全问题

一.servlet和struts1 通常情况下,系统只生成servlet的单一实例之后,为每个用户请求建立新的线程.如果很多请求同时到来,那么多个线程可能会并发的访问同一个servlet对象.因此必须小心地同步对字段以及实例变量和其它共享数据的访问,因为多个线程可能同时对同一数据进行访问.所以使用实例变量会产生不安全的结果.struts1也是这种单例模式. servlet和struts1均是单实例.多线程,在不加锁的情况下尽量不要使用局部变量等带来线程不安全的变量,只有请求和局部变量时线程安全的

关于Struts2 Dispatcher分发器的线程安全问题

问题描述 查看Struts2StrutsPrepareAndExecuteFilter这个类可以看出在服务器进行初始化时,调用了这个类的init化方法dispatcher=init.initDispatcher(config)生成了一个Dipspacher实例.然后在doFilter方法中,通过prepare.assignDispatcherToThread()方法将dispacher对象put进当前线程的ThreadLocalMap中去,其中key是ThreadLocal对象,value是Di

Struts1和Struts2的区别和对比

  Struts1和Struts2的区别和对比: Action 类:• Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去实现常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象. 线程模式:• Struts

struts1与struts2的对比学习

           struts2的出现必定有它的优势,而且他的市场现在已经远远的超过了struts1,那么在解释它的原理之前,我们首先来看一下struts2究竟有哪些优势呢?我们为什么要用struts2?          1.用struts2的目的~~           把请求和界面分开,struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发.           2.那么struts2有哪些优点呢?             a.Struts框

单例模式与线程安全问题浅析

           最近看到到Struts1与Struts2的比较,说Struts1的控制器是单例的,线程不安全的:Struts2的多例的,不存在线程不安全的问题.之后又想到了之前自己用过的HttpHandler...这些类,好像单例的线程安全问题确实是随处可见的.但是只是知道这个是不安全的,也没有认真分析过.接下来就仔细分析下. 一,修改单例模式代码       首先我先写一段单例类的代码:          /** * @ClassName: Sigleton * @Description

struts1 与struts2 有什么区别 菜鸟提问

问题描述 struts1与struts2有什么区别菜鸟提问 解决方案 解决方案二:两者的区别:Action类:◆Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口.◆Struts2Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去实现常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对

struts1和struts2的区别

问题描述 如题 解决方案 解决方案二:-在Action实现类方面的对比:Struts1要求Action类继承一个抽象基类:Struts1的一个具体问题是使用抽象类编程而不是接口.Struts2Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去实现常用的接口.即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts2的Action.-线程模式方面的对比:Str

struts2 action 线程安全同步问题

问题描述 action在配置文件里的属性为:scope="prototype"在高并发请求一个action的时候,怎么解决数据不被重复验证!谢谢!在下面访问的时候出现都修改了数据public String threadTest(){HttpServletRequest request = ServletActionContext.getRequest(); product = productService.getProduct(11440);if(product.getStatus()

Spring-利用ThreadLocal解决线程安全问题

ThreadLocal是什么 ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象.当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本.所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本.从线程的角度看,这个变量就像是线程的本地变量,这也是类名中"Local"所要表达的意思. ThreadLocal的方法很简单,主要的就是4个方法 1234567891011 // 设