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