单例对象和多例对象
单例对象:对于所有的请求都是同一个对象去处理,相当于静态代码,只加载一次,使用多次
单例模式分为两种:
-
懒汉模式:当一个单例模式的类进行加载的时候并不会创建这个这个对象。只有当用到这个类的时候才会去创建这个对象。
-
class Singleton01{ private static Singleton01 modle = new Singleton01();//声明对象同时私有化 private Singleton01(){}//构造函数私有化 public static Singleton01 getInstance(){//向外声明访问该类对象的方法 return modle; } }
-
-
饿汉模式:当类加载的时候直接创建这个对象,不管是否会用到。
-
class Singleton02 { private static Singleton02 modle = null;//声明对象,不实例化 private Singleton02() {}//构造函数私有化 public static Singleton02 getInstance(){//向外提供访问该类对象的方法 if (modle == null) modle = new Singleton02(); return modle; } }
-
多例对象:多次请求创建对个对象进行业务处理
单例对象和多例对象的优缺点:
单例:
- 同一个对象进行处理,降低了内存资源的消耗。
- 单例模式可以让我们只创建一个对象从而避免了频繁创建对象导致的内存消耗和垃圾回收。
- 在饿汉模式下的单例模式需要注意线程安全问题,因为饿汉式在类加载时就会将单例对象创建好,而饿汉式在类加载时不会第一时间创建这个对象。所以在线程并发的情况下可能会创建多个不同的对象
多例:
- 会占用较多的内存
- 但是不会发生线程安全问题。当多个线程争抢同一资源时会发生线程安全问题。
可能使用的地方:
- 三层架构的服务层和持久层对数据进行处理时候,没有什么变化的,可以使用单例模式
- Servlet是单例模式,我们只需要创建一个Servlet,然后接收请求并处理。
- spring的bean默认也是单例模式,springMVC是单例模式,所以我们可以发现我们的service层,dao层,web层都是使用单例模式,单例无处不在。
- Struts框架的action类因为每个用户都有不同的用户名密码等等所以需要用多例模式。