单例对象和多例对象

单例对象和多例对象

单例对象:对于所有的请求都是同一个对象去处理,相当于静态代码,只加载一次,使用多次

单例模式分为两种:

  • 懒汉模式:当一个单例模式的类进行加载的时候并不会创建这个这个对象。只有当用到这个类的时候才会去创建这个对象。

    • 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;
         }
      }
      
      

多例对象:多次请求创建对个对象进行业务处理

单例对象和多例对象的优缺点:

单例:

  1. 同一个对象进行处理,降低了内存资源的消耗。
  2. 单例模式可以让我们只创建一个对象从而避免了频繁创建对象导致的内存消耗和垃圾回收。
  3. 在饿汉模式下的单例模式需要注意线程安全问题,因为饿汉式在类加载时就会将单例对象创建好,而饿汉式在类加载时不会第一时间创建这个对象。所以在线程并发的情况下可能会创建多个不同的对象

多例:

  1. 会占用较多的内存
  2. 但是不会发生线程安全问题。当多个线程争抢同一资源时会发生线程安全问题。

可能使用的地方:

  1. 三层架构的服务层和持久层对数据进行处理时候,没有什么变化的,可以使用单例模式
  2. Servlet是单例模式,我们只需要创建一个Servlet,然后接收请求并处理。
  3. spring的bean默认也是单例模式,springMVC是单例模式,所以我们可以发现我们的service层,dao层,web层都是使用单例模式,单例无处不在。
  4. Struts框架的action类因为每个用户都有不同的用户名密码等等所以需要用多例模式。
可以按照静态内部类创建对象,创建的对象既可以是单例对象,也可以是多例对象,这取决于具体的实现方式。 ### 创建多例对象 静态内部类普通类一样,可以创建多个不同的实例。以下是一个创建多例对象的示例代码: ```java class OuterClass { static class InnerClass { private int value; InnerClass(int value) { this.value = value; } int getValue() { return value; } } } public class Main { public static void main(String[] args) { OuterClass.InnerClass obj1 = new OuterClass.InnerClass(1); OuterClass.InnerClass obj2 = new OuterClass.InnerClass(2); System.out.println(obj1.getValue()); System.out.println(obj2.getValue()); } } ``` 在这个例子中,`InnerClass` 是一个静态内部类,通过多次调用其构造函数,可以创建多个不同的 `InnerClass` 对象。 ### 创建单例对象 可以利用静态内部类实现线程安全的单例模式。静态内部类单例的实现思路是将单例的实例放在一个静态内部类中,在第一次调用单例对象时再进行创建。这种实现方式既能保证线程安全,又能保证单例对象的延迟加载[^2]。以下是一个创建单例对象的示例代码: ```java class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } public class Main { public static void main(String[] args) { Singleton singleton1 = Singleton.getInstance(); Singleton singleton2 = Singleton.getInstance(); System.out.println(singleton1 == singleton2); } } ``` 在这个例子中,`SingletonHolder` 是一个静态内部类,其中的 `INSTANCE` 是 `Singleton` 类的静态常量,通过 `getInstance()` 方法获取的都是同一个实例,保证了单例的特性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值