SpringBoot从入门到精通 - springMVC Controller 是单例还是多线程/线程是否安全

举报
隔壁老汪 发表于 2022/06/23 23:16:34 2022/06/23
【摘要】 有状态和无状态的对象基本概念:  有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。 无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。一般是singleton scope。 ...

有状态和无状态的对象基本概念: 
有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。
无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。一般是singleton scope。

如Struts2中的Action,假如内部有实例变量User,当调用新增用户方法时,user是用来保存数据,那么此action是有状态对象。多个线程同时访问此action时 会造成user变量的不一致。所以action的scope要设计成prototype,或者,User类放到threadLocal里来保持多个线程不会造成User变量的乱串(此种场景没必要放到threadLocal内)。

而Service内部一般只有dao实例变量 如userDao, 因为userDao是无状态的对象(内部无实例变量且不能保存数据),所以service也是无状态的对象。

public   class  XxxAction{

   // 由于多线程环境下,user是引用对象,是非线程安全的  

  public  User user;

  ......

}

public   class  XxxService {  

  // 虽然有billDao属性,但billDao是没有状态信息的,是Stateless Bean.   

  BillDao billDao;  

  ......

}

对于那些会以多线程运行的单例类

局部变量不会受多线程影响,
成员变量会受到多线程影

文章来源: blog.csdn.net,作者:隔壁老瓦,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/wxb880114/article/details/106078218

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。