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

如何使用Java函数实现单例设计模式?

发布时间:2023-06-01 22:53:31

单例模式是一种常见的软件设计模式,它可以确保在整个应用程序中只创建一个类的实例,从而保证资源的恰当分配和实现更好的性能。在Java中,单例模式有许多种实现方式。在本文中,我们将介绍几种最常用的实现方式。

1.懒汉式单例模式

懒汉式单例模式的实现方式相对简单。在这种模式下,类只有在需要时才会创建实例对象。线程不安全的实现方式如下所示:

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

上述代码中,我们通过一个静态方法getInstance()获取对象,其中如果对象未被创建则创建一个对象并返回该对象,否则直接返回已创建的对象。虽然这种方式简单,但是它无法保证线程安全。

针对线程安全问题,我们需要对getInstance()方法加锁处理,如下所示:

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

由于加锁后,每一次只有一个线程获得锁,从而保证线程安全,但是加锁锁粒度大导致效率低下。

2.饿汉式单例模式

饿汉式单例模式是一种在类加载的时候就进行实例化,从而在创建类实例之前就保证实例的存在,线程安全的单例模式实现如下所示:

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

因为在实例化对象时就已经创建好对象,所以不存在多线程安全问题,因此不需要进行加锁操作。不过这种方式会在类加载的时候就创建对象,虽然保证了线程安全,但是可能存在一定的性能问题。

3.双重检查锁定单例模式

双重检查锁定单例模式,是一种在获取单例实例时先进行非锁定的判断。如果实例不存在,则进行锁的处理,创建 的实例对象。该方式解决了懒汉式单例模式的线程安全问题,还具有较好的性能表现。实现方式如下:

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

在该模式下,使用volatile关键字修饰instance变量,防止指令重排,保证线程安全。

以上是Java函数实现单例设计模式的三种典型方式,可以根据自己项目实际需求进行选择。除了上述的方式,还有如枚举单例模式、单元素枚举、静态内部类等单例模式实现方式可以进行参考。