单例模式是一种设计模式,它确保一个类只有一个实例,并提供对该实例的全局访问点。这种模式通常用于需要频繁使用某个对象的场景,例如数据库连接池、线程池等。
在Java中,我们可以使用以下方法实现单例模式:
1、饿汉式(静态内部类):将构造函数私有化,并在类名前加上static关键字,这种方式在类加载时会创建实例,但是没有使用到new关键字,因此性能较低。
public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
2、懒汉式(静态内部类):将构造函数私有化,并将构造函数标记为私有,这种方式在类加载时不会创建实例,而是在第一次使用时才创建实例。
public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
3、双重校验锁(Double Checked Locking):通过两次检查来避免不必要的同步,从而减少性能开销。
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; } }
4、枚举式:使用枚举类型来表示单例类,这种方式可以保证每个类只有一个实例,并且可以通过枚举名称直接访问实例。
public enum Singleton { INSTANCE; public void doSomething() { // 实现具体的业务逻辑 } }
5、静态内部类:将构造函数私有化,并使用静态内部类来实现单例,这种方式的性能较好,但是需要手动创建实例。
public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } }