有状态和无状态---你懂了?

本文深入探讨了有状态(Stateful)与无状态(Stateless)对象的概念,分析了它们在多线程环境下的表现及安全性。通过对比Struts1与Struts2的架构,解释了单例模式与原型模式在确保线程安全中的角色。此外,还讨论了单例模式下对象的状态性及其对线程安全的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有状态和无状态

基本概念:

有状态就是有数据存储功能。**有状态对象(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一个对象出来)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值