SpringMVC单例bean是线程安全的吗?

1.springMVC默认是单例的

对于同一个Controller,只会生成一个实例来处理所有的请求,因此bean实例只会实例化一次,并被存放在工厂中,以供其他请求使用。

不定义成员变量的情况下是线程安全的。

单例的优点:

   1)每次请求不需要重新new一个对象。

   2)垃圾收集和回收时更有效率。

Struts2是类级别的,需要原型实现;
SpringMVC是方法级的,没有共享属性的情况下,线程安全的。

2.使用成员变量在并发情况下的状态

如果设置成员变量,那么在多个请求状态下,该成员变量的值是被共享的;(也就是该成员变量在单例模式下是非线程安全的)

如果只存在读取的操作,则不会有问题。

如果存在写值的操作,则会出现问题,当成员变量值被改变之后,其他请求会请求到修改之后的值。

3.如何正确使用

1.在controller中不使用成员变量;
2.设置controller为多例模式,也就是每请求一次都会创建一个controller的对象。
  设置controller为多例,@Scope("prototype")。

这几种做法有好有坏,第一种,需要开发人员拥有较高的编程水平与思想意识,在编码过程中力求避免出现这种BUG,而第二种则是容器自动的对每个请求产生一个实例,由JVM进行垃圾回收,因此做到了线程安全。
使用第一种方式的好处是实例对象只有一个,所有的请求都调用该实例对象,速度和性能上要优于第二种,不好的地方,就是需要程序员自己去控制实例变量的状态保持问题。第二种由于每次请求都创建一个实例,所以会消耗较多的内存空间。
所以在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你认识小汐吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值