好奇springmvc是单例的还是多例的?
最近看见一个面试题,springmvc是单例的还是多例的?当时犹豫了好久,想着多例吧。错误!默认是单例的。有状态对象(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的。每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
无状态对象(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。
测试 http://localhost:8080/mvc/add num----> 1
http://localhost:8080/mvc/add num----> 2
http://localhost:8080/mvc/reduce num----> 1
控制台打印出结果证明 单例 从始至终 num都是一个实例
再次测试 加入**@Scope(“prototype”)** 变成多例 再看下num的数值
测试 http://localhost:8080/mvc/add num----> 1
http://localhost:8080/mvc/add num----> 1
http://localhost:8080/mvc/reduce num----> -1
为什么是单例的?
- 减少实例生成的系统消耗,效率会高
- gc垃圾回收,就不会回收,因为没有生成实例
- 可以更快的获取到bean ,第一次生成之后 ,就不会再次生成,每次取都是缓存中取
有一个很大的劣势,不能保证线程安全
全局变量和静态变量会引起线程安全问题
若所有的操作都是对变量进行读操作就不会引起线程问题,若有写的操作,那么就需要考虑线程安全问题