1. 什么是单例多例:
所谓单例就是所有的请求都用一个对象来处理, 比如我们常用的 service 和 dao 层的对象通常都是单例的, 而多例则指每个请求用一个新的对象来处理, 比如 action;
2. 如何产生单例多例:
在通用的 SSH 中, 单例在 spring 中是默认的, 如果要产生多例, 则在配置文件的 bean 中添加 scope="prototype";
3. 为什么用单例多例:
之所以用单例, 是因为没必要每个请求都新建一个对象, 这样子既浪费 CPU 又浪费内存;
之所以用多例, 是为了防止并发问题; 即一个请求改变了对象的状态, 此时对象又处理另一个请求, 而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
用单例和多例的标准只有一个:
当对象含有可改变的状态时 (更精确的说就是在实际应用中该状态会改变), 则多例, 否则单例;
4. 何时用单例? 何时用多例?
对于 struts2 来说, action 必须用多例, 因为 action 本身含有请求参数的值, 即可改变的状态;
而对于 STRUTS1 来说, action 则可用单例, 因为请求参数的值是放在 actionForm 中, 而非 action 中的;
另外要说一下, 并不是说 service 或 dao 一定是单例, 标准同第 3 点所讲的, 就曾见过有的 service 中也包含了可改变的状态, 同时执行方法也依赖该状态, 但一样用的单例, 这样就会出现隐藏的 BUG, 而并发的 BUG 通常很难重现和查找;
其实, 单例: 非 static 成员变量及 static 成员变量都是线程不安全, 多例: 非 static 成员变量线程安全, 但多例 static 成员变量会有线程不安全情况, 这时候我们会不会考虑死锁呢?
来源: http://www.bubuko.com/infodetail-2526405.html