struts2 每次请求都来实例化一次action,会不会造成内存溢出

struts 2的Action默认是多实例的,每次请求都要实例化一个对象,strust2的action里面很多情况下都是需要定义成员变量用来接收表单上的值,如果只是一个对象的话,那么很可能会出现多个线程共用一个成员变量 出现线程安全问题,因此struts2每次请求都要创建一个Action对象,它的优势是线程安全的,每次请求都有单独的Action类来处理,不像servlet和struts1一样不是线程安全的。

但是Struts2会为每个请求生成一个Action。不会有性能问题吗?
关于Struts2每次请求都会实例化对象,会不会造成内存溢出,不是什么超级大的项目,没必要考虑这么小的东西,其实Struts2性能肯定是比Struts1稍逊一点 ,再加上OGNL ,那Struts2性能就比Struts1差多了。

Struts2是为每一请求都创建一个action ,这样方便了线程安全的问题,就像java跟c一样,Java说没指针不用考虑内存分配,内存溢出的问题,很方便。但是java的效率比c相比会有些差距。

Struts1的action是单例模式,针对这个action的请求都是由它的唯一实例进行处理,所以它必须是线程安全的。而struts2的action会为每一个请求实例化一个对象,这样就没有线程安全的问题,实际上,servlet容器每次处理请求,都会生成许多将被丢弃的对象,但并没有证据证明更多的对象会产生性能和垃圾回收问题。

关于struts2下多个人同时访问一个单例action的问题
如果我的Action是用Spring托管的,那么默认他是单例的,也就是在内存里只有一个实例,单例模式下是线程不安全的。

在这种情况下,如果有两个用户同时访问同一个Action,会不会出现写入或者读取错误的情况?如果会出现错误,把Action设置为原型模式,action中有Service对象,也是受Spring托管的,那么是不是就会出现多个Action访问一个Service对象的情况,这样岂不是又要出现数据存取错误的情况,这样一层层下去,岂不是都要设置成原型模式?

struts会为每一个请求开启一个线程的,假如会有线程不安全的情况,这个问题还是可以避免,比如不要声明全局变量,那么就不会出现问题, 可以去看看关于内存分配的相关内容 ,并且spring的单例确实存在线程安全的问题。但是spring是如何避免的呢,答案是它用了threadlocal这个类。可以去看看JAVA并发编程实战这本书,里面有对servlet的并发运行原理有比较清楚的讲述,同理也可得出action中的service对象为何不会出现数据存储的错误,大体意思就是每一个用户发出一次请求后就有一个独立的线程与之绑定,且有一个对应的servlet实例,你在其之上做的操作只属于当前servlet实例,不会受其他servlet实例的影响,反之也不会影响其他线程的servlet实例。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值