欢迎访问宙启技术站
智能推送

JAVA中怎么创建单例

发布时间:2023-05-15 11:34:48

单例模式是一种常见的软件设计模式,其主要目的是确保在整个应用程序中只有一个实例对象。在 Java 中,有多种方式可以创建单例,而本文将会介绍几个常见的单例创建方式。

1. 饿汉式

这种方式的实现在类加载时就创建出一个对象,比较简单。例如:

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

优点是线程安全,不需要加锁,缺点是可能会浪费一定的内存和资源。如果不是在应用程序的启动时就需要创建这个单例对象,那么这种方式可能不太适合。

2. 懒汉式(非线程安全)

这种方式在需要获取单例实例对象时才会创建,避免了资源的浪费。例如:

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

这种方式的优点是在需要单例对象时才会创建,避免资源的浪费,但是缺点明显,线程不安全,需要加锁。

3. 线程安全的懒汉式

为了解决懒汉式线程不安全的问题,可以在 getInstance() 方法上加上 synchronized 同步锁,保证线程安全。例如:

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

这种方式的缺点是在 getInstance() 方法上加了同步锁,导致性能下降。

4. 双重检查锁定

双重检查锁定是线程安全的懒汉式单例模式几乎标准的写法。例如:

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

这种方式也称为“双重校验锁”,其优点是线程安全,并且在获取单例对象时只有 次需要同步锁,后续的获取都不需要,性能较好。

5. 枚举类

在 Java 5 之后,枚举类也可以用来实现单例。例如:

public enum Singleton {
    INSTANCE;
}

这种方式非常简洁,线程安全,并且可以防止反序列化时产生新的实例,但是一些开发者可能不太熟悉枚举的用法,导致不容易理解。

综上所述,不同的单例创建方式各有优缺点,应根据具体的应用场景、性能要求等因素进行选择。