DCL_单例模式

2022-10-27 10:05:00 浏览数 (3)

简介

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

为什么使用单例模式:

多个线程操作不同实例对象。多个线程要操作同一对象,要保证对象的唯一性

优点:

1、在内存里只有一个实例,减少了内存的开销

2、避免对资源的多重占用

单例模式的分类

在对比每个模式通常往一下三个方面:线程的安全性、性能、懒加载(lazy )

  • 1.饿汉式:
代码语言:javascript复制
public class HungerySingleton {
    //加载的时候就产生的实例对象
    private static HungerySingleton instance=new HungerySingleton();
    private HungerySingleton(){
    }
 
    //返回实例对象
   public static HungerySingleton getInstance(){
        return instance;
   }
 
    public static void main(String[] args) {
        for (int i = 0; i < 20; i  ) {
            new Thread(()->{
                System.out.println(HungerySingleton.getInstance());
            }).start();
        }
    }
}

线程安全性:在加载的时候已经被实例化,所以只有这一次,线程安全的

懒加载:没有延迟加载,好长时间不使用,影响性能

性能:性能比较好

  • 2.懒汉式
代码语言:javascript复制
public class HoonSingleton {
    private static HoonSingleton instance=null;
    private HoonSingleton(){
    }
    public static HoonSingleton getInstance(){
        if(null==instance)
            instance=new HoonSingleton();
        return instance;
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 20; i  ) {
            new Thread(()->{
                System.out.println(HoonSingleton.getInstance());
            }).start();
        }
    }
}

线程安全:不能保证实例对象的唯一性,非线程安全

懒加载:引发了一个不安全的问题,对于单例模式的应用有风险,而且风险比较大,,实现了懒加载

性能:相对于饿汉式还是比较好的

  • 3.懒汉式 同步方法

线程安全:是线程安全

懒加载:是懒加载

性能: synchronized 退化到了串行执行

  • 4.Double-Check-Locking
代码语言:javascript复制
public class DCL {
    private static DCL instance=null;
    private DCL(){
    }
    public  static DCL getInstance(){
        if(null==instance)
            synchronized (DCL.class){
               if(null==instance)
                    instance=new DCL();
            }
        return instance;
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 20; i  ) {
            new Thread(()->{
                System.out.println(DCL.getInstance());
            }).start();
        }
    }
}

性能比较好

懒加载:实现了懒加载

线程的安全性:保证了线程的安全

  • 5.Volatile Double-check

只需要加一段代码:

代码语言:javascript复制
private volatile static DCL instance=null;

可以避免空指针异常

  • 6.Holder

声明类的时候,成员变量中不声明实例变量,而放到内部静态类中

代码语言:javascript复制
public class HolderDemo {
    private HolderDemo(){
 
    }
    private static class Holder{
        private static HolderDemo instance=new HolderDemo();
    }
    //懒加载
    //synchronized
    //<init>
    public static HolderDemo getInstance(){
        return Holder.instance;
    }
 
    //广泛的一种单例模式
}
  • 7.枚举
代码语言:javascript复制
public class EnumSingletonDemo {
    private EnumSingletonDemo(){
    }
    //延迟加载
    private enum EnumHolder{
        INSTANCE;
        private static  EnumSingletonDemo instance=null;
 
        private EnumSingletonDemo getInstance(){
            instance=new EnumSingletonDemo();
            return instance;
        }
    }//懒加载
    public static EnumSingletonDemo  getInstance(){
        return EnumHolder.INSTANCE.instance;
    }
}

0 人点赞