在Java中,有几种常见的方法可以实现单例模式:
- 懒汉式(线程不安全):
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
这种实现方式在多线程环境下是不安全的,可能会创建多个实例。
- 懒汉式(线程安全,双重检查锁定):
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; } }
这种实现方式在多线程环境下是安全的,但是效率较低。
- 饿汉式:
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }
这种实现方式在类加载时就创建实例,所以不会浪费资源,但是类加载较慢时可能会导致启动时间较长。
- 静态内部类:
public class Singleton { private Singleton() { } private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }
这种实现方式利用了Java的静态内部类特性,既保证了线程安全,又实现了懒加载。
- 枚举:
public enum Singleton { INSTANCE; public void doSomething() { // ... } }
这种实现方式利用了Java的枚举特性,既保证了线程安全,又实现了懒加载。这是实现单例模式的最佳实践。