Struts 里的单例和多例

不是很了解struts 里 action为什要多例。
例如现在有100个客户端访问我的web程序(没有静态变量)
那不是每个客户端都有自己的堆栈吗,为什么单例模式下客户端之间会相会影响数据。

2个回答

其实单例的Action 就可以理解成一个静态的全局变量 如果Action设置成单例 那么在Tomcat启动并且第一次访问后 这个Action会一直存在 共享ActionContext和ValueStack, 这时候如果能保证单线程访问固然是没问题的 但是在并发访问的环境中, 多个访问同时通过 一套ActionContext和ValueStack存储或请求数据 必然会发生错误, 这个跟JAVA的公用静态变量有些相似之处 在JAVA中对于避免静态变量的并发使用可以通过加锁等方法避免错误 而Struts通过多例Action 确保每次请求都拥有独立的ActionContext和ValueStack,来保证数据的正确性,每次有请求访问服务器服务器都对应的创建一个Action实例以供使用

A_A333
A_A333 看到valuestack就知道啦
2 年多之前 回复
qq_31754085
IT迷你白 值栈 这个不叫堆栈说错了
2 年多之前 回复
A_A333
A_A333 感谢,懂了不少,谢谢啦
2 年多之前 回复
qq_31754085
IT迷你白 一个Action有一个堆栈 用来存储数据 也就是ValueStack 可以把它当成类的静态变量
2 年多之前 回复
A_A333
A_A333 那为什么方法就会重新创建变量,类不会,意思就是说单例,多例模式只对类字段生效,还是说,方法里面变量是每个客户端一个堆栈,类使用同一个堆栈。还是别的
2 年多之前 回复
qq_31754085
IT迷你白 方法变量不存在并发问题
2 年多之前 回复
qq_31754085
IT迷你白 不会 下一条线程是从新开始这个 方法 会重新创建方法变量
2 年多之前 回复
A_A333
A_A333 奥,懂了,非常感谢您,但还是非常想深入的问下,假设一个线程在创建完方法变量的时候被挂起,那么下一条线程呢,会不会继续沿用这个变量(单例模式下)
2 年多之前 回复
qq_31754085
IT迷你白 方法里的变量只有执行方法时才会创建 执行完方法就销毁了 一般不会影响到
2 年多之前 回复
A_A333
A_A333 那可以问下为什么不会影响对象方法里的变量呢,既然都是共享对象了
2 年多之前 回复
qq_31754085
IT迷你白 当一个用户访问完了 另一个用户访问并携带了参数 action中的数据会被替换掉 但是如果第一个用户没有访问完成 那第一个用户就拥有第二个用户的数据了
2 年多之前 回复
qq_31754085
IT迷你白 回复A_A333: 可以这么理解 但是如果能保证不会并发访问 还是不会共享的
2 年多之前 回复
A_A333
A_A333 emem,是不是单例模式下的每个客户端都是共享变量的,即使不是static字段,也是共享的
2 年多之前 回复

struts2的Action是多实例,也就是每次请求产生一个Action的对象。原因是:struts2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。

A_A333
A_A333 谢谢啦,上面比较详细,就采纳上面得了,感谢您的回答
2 年多之前 回复
qq_35987286
SKR-SKR 回复A_A333: action是单列的话,也就是说只创建了一个action对象,这样也就是只有一个堆栈
2 年多之前 回复
A_A333
A_A333 em,理解了部分,但是每个客户端不是有自己的堆栈来存储变量吗,为什么会相互影响?我理解的是只有静态变量才会相互影响
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐