关于 SpringMVC 的原型模式和单例模式

2019-05-21 12:46:01 +08:00
 hastyfish

单例模式是单对象多线程,但会有并发问题 原型模式是浅复制多个对象给每个用户,不会有并发问题 如果是个中小型项目,在没有并发问题的地方用单例模式,有并发问题的地方用原型模式 这样理解对吗?

1464 次点击
所在节点    问与答
10 条回复
micean
2019-05-21 13:02:59 +08:00
线程安全不分项目大小
单例有没有并发问题取决于你怎么取用
设计模式是用来解决问题,不是产生问题
hastyfish
2019-05-21 13:08:05 +08:00
@micean
我的意思是解决线程安全问题是单例模式下加锁还是直接用原型模式难道不是根据项目大小吗
wolfie
2019-05-21 13:14:27 +08:00
@hastyfish #2
Struts 使用成员变量接收参数,不能使用单例。
SpringMVC 对应的请求是一个方法。
hastyfish
2019-05-21 13:19:22 +08:00
@wolfie
我没有说接受参数问题。。。
micean
2019-05-21 14:05:28 +08:00
@hastyfish
加锁和实例化哪个性能损耗高也要看具体情况
自己做一遍测试根据结果选择哪种方式
passerbytiny
2019-05-21 14:40:47 +08:00
谁告诉你单例模式是单对象多线程的,谁告诉你原型模式是复制对象的,又是谁告诉你 Spring Bean 的作用范围是跟并发有关系的,净干些误人子弟的事。

单例模式是设计模式的一种,当一个类,不管有多少个对象,你都可以把他看成一个对象的时候,为了性能上的考虑,可以采用单例模式。用之后更通俗的方式说,就是:无状态对象,采用单例模式。是否采用单例模式,仅取决于该类是否有状态,与多线程没有关系。严格的单例模式是要求全局都最多只有一个对象的(此时对象是允许有全局状态的),但实际上很难做到这样,Spring 的单例模式是每个容器一个对象,并不是全局一个。

虽然 Spring 可能使用的浅复制去生成原型范围(请注意是范围不是模式)的 Bean 的新实例,但那只是技术实现或性能手段,在逻辑上,那就是个 new 了一个新对象。原型与新的 Bean 实例的关系,是类与对象的关系,不是对象与克隆的关系。

无状态 Bean 用默认的单例模式,有状态 Bean 用原型模式,跟线程、并发没关系。另外,Spring Bean 不管是有状态还是无状态,通常主体都是服务而不是数据,是线程本身而不是线程要处理的共享数据。
hastyfish
2019-05-21 15:15:17 +08:00
@passerbytiny
我的意思是 springMVC 中那个控制器选用单例模式还是原型模式。
想想 servlet 就是创建一个 servlet 对象,对于每一个用户都开启一个线程,我只的单例多线程是这个意思
hastyfish
2019-05-21 15:19:58 +08:00
@passerbytiny
spring bean 主要是为了 IoC 这肯定和并发没关
passerbytiny
2019-05-21 15:48:47 +08:00
@hastyfish #7 控制器仍然是 Bean,唯一特殊的地方就是他通常是一个有状态 Bean,默认非单例,至于是 prototype 还是 request,我不太清楚。你的 servlet 线程模式已经是老黄历了,现在是 nio,不是 线程。
hastyfish
2019-05-21 16:24:18 +08:00
@passerbytiny
今天算是体验到了什么叫听君一句话,胜读十年书
老师在讲 JSP,我以为我已经跟上时代了,原来还差得远了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566168

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX