单例形式(Singleton Pattern)是一种设计形式,它允许创立一个类只要一个实例,并供给大局拜访点。在许多状况下,这是一种十分有用的形式,例如,当你想确保只要一个数据库衔接,或许当你想约束某个资源的数量时。在本文中,我将详细介绍单例形式,包括它的运用场景、完成办法、优缺陷以及一些运用该形式的实例。

1. 单例形式的运用场景

单例形式在以下状况下特别有用:

  • 当一个类的实例化过程十分消耗资源时,如数据库衔接或许文件读取等。
  • 当你需求约束一个类的实例数量,例如,一个类只能有一个实例,或许一个类最多只能有几个实例。
  • 当你需求大局拜访某个目标时,例如,一个日志记录器或许一个装备目标。

单例形式的完成办法
单例形式有多种完成办法,下面介绍其中几种。

1.1 饿汉式

饿汉式是最简略的一种完成办法,它在类加载时就创立了实例,因而是线程安全的。它的代码完成如下:

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

在该完成办法中,instance 是静态变量,它在类加载时就被创立了实例。因而,该完成办法是线程安全的。但是,它有一个缺陷,即如果该类没有被运用到,那么它的实例也会被创立出来,浪费了资源。

1.2 懒汉式

懒汉式是一种在第一次运用时才创立实例的完成办法。这种办法在多线程环境下或许存在问题,需求进行同步处理。代码完成如下:

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在该完成办法中,instance 是静态变量,它在第一次调用 getInstance() 办法时才被创立。由于该办法被加了 synchronized 关键字,所以它是线程安全的。但是,该完成办法的功能或许较低,因为每次调用 getInstance() 办法时都需求进行同步处理。

1.3 两层查看锁式

两层查看锁式是一种改进的懒汉式完成办法,它只在第一次调用 getInstance() 办法时进行同步处理,然后提高了功能。代码完成如下:

public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

在该完成办法中,instance 是静态变量,并且加了 volatile 关键字,以确保多线程环境下的可见性和有序性。在 getInstance() 办法中,先进行一次非同步的判别,如果 instance 为 null,就进行同步处理。同步处理后,再次判别 instance 是否为 null,如果是,就创立实例。由于加了 volatile 关键字,确保了多线程环境下的可见性和有序性,然后确保了线程安全和功能。

1.4 静态内部类式

静态内部类式是一种十分高雅的完成办法,它利用了 Java 的语法特性,确保了线程安全和功能。代码完成如下:

public class Singleton {
    private Singleton() {}
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

在该完成办法中,SingletonHolder 是一个静态内部类,它在类加载时并不会被初始化。只要在第一次调用 getInstance() 办法时,它才会被加载,然后创立了实例。由于该完成办法只要在第一次调用 getInstance() 办法时才会创立实例,因而是线程安全的。而且,由于静态内部类只会被加载一次,因而也确保了功能。

2. 单例形式的优缺陷

单例形式的长处如下:

  1. 确保了一个类只要一个实例。
  2. 供给了一个大局拜访点,方便了对该实例的拜访和运用。
  3. 减少了内存开支,避免了频频的创立和销毁目标。

单例形式的缺陷如下:

  1. 单例形式的扩展性较差,因为它约束了实例数量。
  2. 单例形式或许会增加代码的复杂性。
  3. 单例形式对单元测试的支撑不好,因为它或许会发生一些副作用。
  4. 单例形式的运用实例

2.1 下面是一些运用单例形式的实例:

  1. java.lang.Runtime 类:它是一个单例类,表示 Java 运行时环境。
  2. java.awt.Desktop 类:它是一个单例类,用于翻开文件、翻开 URI 等操作。
  3. java.util.logging.Logger 类:它是一个单例类,用于记录日志。
  4. java.lang.ClassLoader 类:它是一个单例类,用于加载 Java 类。

3. 定论

单例形式是一种十分有用的设计形式,它允许创立一个类只要一个实例,并供给大局拜访点。在本文中,咱们介绍了单例形式的运用场景、完成办法、优缺陷以及一些运用该形式的实例。在实践使用中,咱们需求依据详细的状况选择合适的完成办法,并依据实践需求灵敏使用单例形式。