Struts小总结

来源:互联网 发布:mac pro apple care 编辑:程序博客网 时间:2024/06/10 15:18
1.

struts2下多个人同时访问一个单例action的问题

如果我的Action是用Spring托管的,那么默认他是单例的。这应该是对的吧。也就是在内存里只有一个实例,是吧。单例模式下是线程不安全的,对吧。在这种情况下,如果有两个用户同时访问同一个Action,比如A用户带着用户名:张三,B用户带着用户名:李四。这是不是属于多线程?会不会出现写入或者读取错误的情况?为什么,谢谢如果会出现错误,吧Action设置为原型模式,action中有Service对象,也是受Spring托管的,那么是不是就会出现多个Action访问一个Service对象的情况,这样岂不是又要出现数据存取错误的情况。这样一层层下去,岂不是都要设置成原型模式?

没太明白你的意思,但是我简单说明一下,struts会为每一个请求开启一个线程的,所以你说的问题根本不存在,当然假如会有线程不安全的情况,你的问题还是可以避免,比如不要声明全局变量,那么就不会出现问题, 你可以简单的去看看关于内存分配的相关内容
追问:
因为struts会为每一个请求开启一个线程,多个线程访问同一份action对象,那么单例下的action是线程不安全的,而在开发中一般都会定义几个全局变量的。这样理论上应该出现问题才对啊,我上一个线程读的这个用户的信息,会被另一个用户的线程读取到。实践中貌似很少出现这样的问题,struts或者spring是不是有什么机制避免的?
追答:
明白你的意思了,首先说你是一个很爱探究问题的。答案很明确,是不会出现问题的,并且spring的单例确实存在线程安全的问题。但是spring是如何避免的呢,答案是他用了threadlocal这个类,这个类的实现也很简单,百度一下或者去看看java的书籍就明白啦,祝你好运
这个问题我建议你去看看JAVA并发编程实战这本书,里面有对servlet的并发运行原理有比较清楚的讲述,同理也可得出action中的service对象为何不会出现数据存储的错误,大体意思就是每一个用户发出一次请求后就有一个独立的线程与之绑定,且有一个对应的servlet实例,你在其之上做的操作只属于当前servlet实例,不会受其他servlet实例的影响,反之也不会影响其他线程的servlet实例。







0 0
原创粉丝点击