0
点赞
收藏
分享

微信扫一扫

es6面试题

胡桑_b06e 03-09 12:00 阅读 1

单例模式(Singleton Pattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在 Java 中实现单例模式有多种方式,以下是其中两种最常见的实现:

1. 懒汉式(Lazy Initialization)

懒汉式单例在第一次被引用时才会创建单例实例。这种方式可以节省资源,但需要考虑线程安全的问题。

public class LazySingleton {
2    private static LazySingleton instance;
3
4    private LazySingleton() {
5        // 私有构造函数,防止外部实例化
6    }
7
8    public static synchronized LazySingleton getInstance() {
9        if (instance == null) {
10            instance = new LazySingleton();
11        }
12        return instance;
13    }
14}

在上述代码中,getInstance 方法被标记为 synchronized,它能确保在多线程环境中只创建一个实例。但是,它可能会引入性能开销,因为每次访问 getInstance 都需要进行线程同步。

2. 饿汉式(Eager Initialization)

饿汉式单例在类加载时就创建了单例实例,这避免了线程同步问题,但可能会导致资源浪费,尤其是如果该实例从未被使用。

1public class EagerSingleton {
2    private static final EagerSingleton instance = new EagerSingleton();
3
4    private EagerSingleton() {
5        // 私有构造函数,防止外部实例化
6    }
7
8    public static EagerSingleton getInstance() {
9        return instance;
10    }
11}

饿汉式单例是线程安全的,因为它的初始化是在类加载的时候完成的。

更好的实现方式:枚举单例

Java 枚举提供了一种更简洁、安全和自动支持序列化机制的单例实现方式。

1public enum EnumSingleton {
2    INSTANCE;
3
4    public void doSomething() {
5        // 实现你的业务逻辑
6    }
7}

使用枚举实现的单例模式非常简单,并且 JVM 保证枚举值是唯一的,所以它是线程安全的。你可以这样使用枚举单例:

1public class Main {
2    public static void main(String[] args) {
3        EnumSingleton.INSTANCE.doSomething();
4    }
5}

静态内部类方式(Initialization-on-demand holder idiom)

这种方式利用了类加载机制来保证初始化实例时只有一个线程。

1  public class StaticInnerClassSingleton {
2    private StaticInnerClassSingleton() {
3        // 私有构造函数,防止外部实例化
4    }
5
6    private static class SingletonHolder {
7        private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
8    }
9
10    public static StaticInnerClassSingleton getInstance() {
11        return SingletonHolder.INSTANCE;
12    }
13}

在 getInstance 方法被调用之前,SingletonHolder 类不会被初始化,只有在实际使用时才会创建实例。这种方式既实现了懒加载,也确保了线程安全。

以上就是几种在 Java 中实现单例模式的方法。每种方法都有其适用场景,你可以根据你的具体需求选用最合适的实现方式。在实践中,枚举单例和静态内部类单例因其简洁和线程安全性而被推荐使用。

举报

相关推荐

0 条评论