struts/spring 单例是否线程安全的
2013-12-18 00:17
232 查看
线程不安全的。原因如下:
第一点,先理解为何线程不安全
1 struts1的action是单例的,所以存在线程安全问题
2 spring默认的注入也是单例的,所以也存在线程安全问题
先理解为何会有线程不安全的问题,比如有一个类Person 有个属性是name,线程1修改了这个属性的name,要进行存入数据库操作的时候,线程2又修改了这个name,这样线程1就存入了一个线程2修改过的数据了。
避免的方法很简单
?struts1如果被spring管理,那么可以设置成scope为protype,这样action就不是单例了,而是为每个线程都创建一个;
?线程安全是可以避免的,就是禁止用可变动的成员变量,如果都是局部变量的话,即使是单例的也不存在任何问题
private JdbcTemplate jdbcTemplate;
private LobHandler lobHandler;?
里面没什么可变成员变量,说以他们是单例的,但是不会有线程问题
第二点:深入理解
1.首先要理解为什么会产生线程不安全的情况,然后再去考虑一个类是否线程安全
2.其次,线程是否安全,其实和spring、struts没有必然关系
你说struts的action不是线程安全的,那是因为你在action里定义了属性
比如:
Java code
如果有多个用户上来访问这个SampleAction,而且每个用户都要来修改user属性或者说是要对user进行某种操作,那么这就是一种线程不安全的情况,或者说是场景。
但是,如果你不定义这个user属性,也不定义任何其他属性,那么这个SampleAction就不存在线程不安全的问题。还有种情况,如果你这个属性定义成final的,只是在初始化的时候进行一次赋值,以后所有的操作都只是读取、而不会修改这个属性的值,那么也不会有线程安全的问题。
再比如,有一个类User,你每次使用这个类的时候都是new出来的,那么这个类一定是线程安全的吗?也不一定。
Java code
对于这个User类,即使你每次都是new一个新的,它也不是线程安全的。
第一点,先理解为何线程不安全
1 struts1的action是单例的,所以存在线程安全问题
2 spring默认的注入也是单例的,所以也存在线程安全问题
先理解为何会有线程不安全的问题,比如有一个类Person 有个属性是name,线程1修改了这个属性的name,要进行存入数据库操作的时候,线程2又修改了这个name,这样线程1就存入了一个线程2修改过的数据了。
避免的方法很简单
?struts1如果被spring管理,那么可以设置成scope为protype,这样action就不是单例了,而是为每个线程都创建一个;
?线程安全是可以避免的,就是禁止用可变动的成员变量,如果都是局部变量的话,即使是单例的也不存在任何问题
private JdbcTemplate jdbcTemplate;
private LobHandler lobHandler;?
里面没什么可变成员变量,说以他们是单例的,但是不会有线程问题
第二点:深入理解
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一个新的,它也不是线程安全的。
相关文章推荐
- struts2 iterator标签status属性
- 在Java中究竟什么是null?
- Java:单例模式的七种写法
- 探索并发编程(三)------Java存储模型和共享对象
- js 取得request 中的值(struts jsp action)
- Spring2.5.x以后使用注解方式的事务管理配置
- Spring JdbcTemplate方法详解
- Java获取文件目录(路径)的方式
- eclipse不能自动编译APK
- struts2+hibernate3+spring3(ssh2)框架下的web应用(1)
- struts2+hibernate3+spring3(ssh2)框架下的web应用(2)
- SSH框架中 Spring设置定时器 Quartz
- struts2实现带进度条的文件上传
- spring-data-jpa 入门资料
- Java中的IO流系统详解
- java基础2013
- java基础2013
- Struts2的文件上传
- 分析java线程(analyze java thread)
- 第二十二天【java虐我千百遍,我待java如初恋】