推荐答案
在 Java 中,单例模式的实现方式主要有以下几种:
- 饿汉式
- 懒汉式
- 双重检查锁定
- 静态内部类
- 枚举
1. 饿汉式
// www.javascriptcn.com code example
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}2. 懒汉式
// www.javascriptcn.com code example
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}3. 双重检查锁定
// www.javascriptcn.com code example
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. 静态内部类
// www.javascriptcn.com code example
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}5. 枚举
public enum Singleton {
INSTANCE;
public void doSomething() {
// 业务逻辑
}
}本题详细解读
1. 饿汉式
饿汉式在类加载时就完成了实例化,避免了多线程同步问题。优点是实现简单,线程安全;缺点是如果从未使用过该实例,会造成内存浪费。
2. 懒汉式
懒汉式在第一次调用 getInstance 方法时才创建实例,节省了内存。缺点是每次调用 getInstance 方法时都需要进行同步,影响性能。
3. 双重检查锁定
双重检查锁定结合了懒汉式和饿汉式的优点,既实现了延迟加载,又保证了线程安全。通过 volatile 关键字和双重检查机制,确保了在多线程环境下也能正常工作。
4. 静态内部类
静态内部类方式利用了类加载机制来保证初始化实例时只有一个线程,既实现了延迟加载,又保证了线程安全。这种方式比双重检查锁定更加简洁。
5. 枚举
枚举方式是实现单例模式的最佳方式。它不仅保证了线程安全,还能防止反序列化重新创建新的对象。枚举单例是《Effective Java》作者 Josh Bloch 推荐的方式。
每种实现方式都有其适用场景,开发者可以根据具体需求选择最合适的实现方式。