有状态和无状态
基本概念:
有状态就是有数据存储功能。**有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。**在不同方法调用间不保留任何状态。
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。
class statefulbean{
//有实体类,要存取信息,在多线程下,是共享,非线程安全
User user;
userget();
userset();
}
class statelessbean{
//虽然有dao属性,但是是不存储信息的,线程安全
Dao userDao;
daoset();
daoget();
}
之前碰到一个面试题,有点懵逼,struts1和2是线程安全的吗?
**Struts1基于单例模式实现,也就是只有一个Action实例供多线程使用。**默认的模式是前台页面数据通过actionForm传入,在action中的excute方法接收,这样action是无状态的,所以一般情况下Strunts1是线程安全的。如果Action中用了实例变量,那么就变成有状态了,同样是非线程安全的
**Struts2默认的实现是Prototype模式。**也就是每个请求都新生成一个Action实例,所以不存在线程安全问题。需要注意的是,如果由Spring管理action的生命周期, scope要配成prototype作用域。
这时候我又想到,单例模式就是无状态的吗?
单例类可以是有状态的(stateful),一个有状态的单例对象一般也是可变(mutable)单例对象 。 有状态的可变的单例对象常常当做状态库(repositary)使用
单例类也可以是没有状态的(stateless) ,仅用做提供工具性函数的对象。既然是为了提供工具性函数,也就没有必要创建多个实例,因此使用单例模式很合适。平常的单例类都是没有状态的
总的来说,Stateless无状态用单例Singleton模式,Stateful有状态就用原型Prototype模式。
(单例singleton模式就是spring容器中只new一个共享对象,多次调用都是调用同一个对象,线程不安全,性能高
原型prototype就是每次你调用都会new一个对象出来)