线程不安全的。(其实我觉得回答为:存在线程安全问题 这样比较好点)

原因如下:

第一点,先理解为何线程不安全

1 struts1的action是单例的,所以存在线程安全问题(struts2是多例的,不存在线程安全问题)
spring默认的注入也是单例的,所以也存在线程安全问题

先理解为何会有线程不安全的问题,比如有一个类Person 有个属性是name,线程1修改了这个属性的name,要进行存入数据库操作的时候,线程2又修改了这个name,这样线程1就存入了一个线程2修改过的数据了。

避免的方法很简单
        struts1如果被spring管理,那么可以设置成scope为protype,这样action就不是单例了,而是为每个线程都创建一个;
        线程安全是可以避免的,就是禁止用可变动的成员变量,如果都是局部变量的话,即使是单例的也不存在任何问题
        里面没什么可变成员变量,说以他们是单例的,但是不会有线程问题

第二点:深入理解

1.首先要理解为什么会产生线程不安全的情况,然后再去考虑一个类是否线程安全
2.其次,线程是否安全,其实和spring、struts没有必然关系

你说struts的action不是线程安全的,那是因为你在action里定义了属性
比如:

Java code
 public class SampleAction extends Action { private String user = null; ... }
 

如果有多个用户上来访问这个SampleAction,而且每个用户都要来修改user属性或者说是要对user进行某种操作,那么这就是一种线程不安全的情况,或者说是场景。
     但是,如果你不定义这个user属性,也不定义任何其他属性,那么这个SampleAction就不存在线程不安全的问题。还有种情况,如果你这个属性定义成final的,只是在初始化的时候进行一次赋值,以后所有的操作都只是读取、而不会修改这个属性的值,那么也不会有线程安全的问题。
    再比如,有一个类User,你每次使用这个类的时候都是new出来的,那么这个类一定是线程安全的吗?也不一定。

Java code
 public class User { private static String name = null; public User(String name) { User.name = name; } }
 

对于这个User类,即使你每次都是new一个新的,它也不是线程安全的。

总结:servlet、struts1 都是单例的,既然是单例,如果当使用实例变量(static 也就是共享的数据变量)的时候就会有线程安全的问题; struts2必须是线程安全的; 因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了;SpringMVC的controller默认是单例模式(spring 注入的时候可以改配置文件scope="prototype" 非单例)的,所以也会有多线程并发的问题;

解决方法:1)同步共享数据     2)不使用成员实例变量; 3)使用只读数据

文章转自:http://m.blog.csdn.net/blog/panhaixin1988/14209651

SpringMVC和Struts是线程安全的吗?为什么?的更多相关文章

  1. springmvc中request的线程安全问题

    SpringMvc学习心得(四)springmvc中request的线程安全问题 标签: springspring mvc框架线程安全 2016-03-19 11:25 611人阅读 评论(1) 收藏 ...

  2. 面试中问到SpringMVC与struts的区别

    1.先简单的介绍一下SpringMVC 废话不多说,其实SpringMVC就是一个MVC的框架,SpringMVC它的annotation式的开发比struts 开发的方便很多,可以直接代替strut ...

  3. Springmvc 并发访问的线程安全性问题

    首先对于spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一 ...

  4. struts 2学习笔记—浅谈struts的线程安全

    Sruts 2工作流程: Struts 1中所有的Action都只有一个实例,该Action实例会被反复使用.通过上面Struts 2 的工作流程的红色字体部分我们可以清楚看到Struts 2中每个A ...

  5. Servlet、SPringMVC、Struts等防止表单反复提交的多种处理方法

    第一种处理方法(非拦截器): 眼下这样的方法不建议,由于JSP规范不建议写JAVA代码.这样的能够方便另外一种处理方法的理解,另外一种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机 ...

  6. SpringMVC系列之(二) springMVC和Struts异同

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...

  7. SpringMVC与Struts不同(五)

    springmvc与struts2不同 1.springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器. 2.springmvc是基于方法开发(一个url对 ...

  8. springmvc与struts的区别

    一.拦截机制 1.Struts2 a.Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype ...

  9. springMVC和Struts异同

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...

随机推荐

  1. ​Web安全测试解决方案

    Web安全测试解决方案 介绍常见的Web安全风险,Web安全测试方法.测试基本理论和测试过程中的工具引入

  2. pyx文件 生成pyd 文件用于 cython调用

    转于:https://www.2cto.com/kf/201405/304168.html 1. 初衷 最近学用python,python不愧是为程序员考虑的编程语言,写起来很快很方便,大大节省开发效 ...

  3. http状态码301和302的区别

    1.官方的比较简洁的说明: 301 redirect: 301 代表永久性转移(Permanently Moved) 302 redirect: 302 代表暂时性转移(Temporarily Mov ...

  4. 《vim实用技巧》读书笔记

    1.  . 命令 2.  * 命令 3.  cw 命令: (c:修改)会删除从光标位置到单词结尾间的字符,并进入插入模式. eg:  cw.copy1  即: 删除从光标位置到单词结尾间的字符,并插入 ...

  5. MYSQL escape用法--转义

    在sql like语句中,比如 select * from user where username like '%nihao%',select * from user where username l ...

  6. 第二十六课 典型问题分析(Bugfix)

    问题1: glibc中的strdup实现如下: 没有对参数s进行空指针判断. 我们的Exception.cpp中应做改进: 在第12行进行判断空指针操作. 问题2: t1在析构时会抛出异常,我们在re ...

  7. PHP设计模式之观察者模式(转)

    开篇还是从名字说起,“观察者模式”的观察者三个字信息量很大.玩过很多网络游戏的童鞋们应该知道,即便是斗地主,除了玩家,还有一个角色叫“观察者".在我们今天他谈论的模式设计中,观察者也是如此. ...

  8. [LeetCode&Python] Problem 530. Minimum Absolute Difference in BST

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  9. 测试那些事儿—web测试方法之输入框

    一.字符型输入 (1)字符型输入框 英文全角,英文半角,数字,空或者空格,特殊字符“~!@#¥%.......&*?{}[]"特别要注意单引号和&符号.禁止直接输入特殊字符时 ...

  10. xdoj 1146 (逆向01背包)

    背包 有:01背包 逆向背包  多重背包 完全背包  所有的背包都可以根据更新的方向一维实现 amazing?! #include <iostream> #include <cstd ...