有状态bean和无状态bean? Spring 单例模式如何解决保存用户信息并且保证线程安全。





有状态对象

就是有实例变量的对象,可以保存数据,是非现场安全的。每个用户都有自己特有的实例,在用户的生命周期中,bean保存了用户的信息,即为“偶状态”;一旦用户衰亡(调用结束),bean的生命周期也随之结束。即每个用户最初都会得到一个初始的bean。

无状态对象

就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

而在spring中可以使用 @Scope 来控制作用范围通常使用的是

  1. @Scope(“singleton”) 也就是默认值 单例模式(分为无状态bean 和有状态bean,通常我们不会增加变量,只是专注于方法本身不会有数据共享的情况,只是单纯的查操作)
  2. @Scope(“prototype”) 多例模式

Spring 单例模式如何解决保存用户信息并且保证线程安全。

使用单例模式下,如果存储用户信息会存在线程安全问题。那么就使用ThreadLocal对象来解决,将用户信息存储在当前线程分配的ThreadLocal,然后调用结束后在清除当前ThreadLocal的信息记录。这样就可以在单例无状态的Bean下实现存储数据了。
单例有状态的bean当然会有线程安全问题。






如有错误欢迎指正

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值