当我们需要保证一个类在整个应用程序中只有一个实例时,可以采用单例模式。其中的“单例”意味着单个实例。在Java中,有多种方法可以实现单例模式,其中比较简单且常用的一种方法是使用“懒汉式”的单例模式。
什么是 Singleton 模式?
Singleton 模式是设计模式的一种,它可以确保在整个应用程序中只有一个特定的实例。在Java中,Singleton模式是一种非常常见的设计模式。Singleton 模式的核心思想是通过使类只有一个实例来帮助我们管理应用程序中的状态和资源。
当系统中存在只需要一个实例的类时,使用 Singleton 模式是非常有用且必要的,它可以确保一个类只有一个对象实例。Singleton 模式有许多优点,如:
- 提供全局访问访问点:任何代码都可以很容易地访问 Singleton 类的实例。
- 延迟实例化: Singleton 模式可以确保一个实例只在需要时才被实例化,从而提高了性能和资源的使用效率。
- 提供对唯一实例的更加严格的控制: Singleton 模式在特定场景下可以确保只有一个实例,这可以避免资源的浪费。
实现一个 Singleton 类
我们来看下实现 Singleton 模式的方式之一: 懒汉式。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在这个示例中, getInstance() 方法返回 Singleton 类的单个实例,并将其初始化为包含空值的“ null ”。如果当前实例不存在,则需要创建一个新的 Singleton 实例。
双重检查锁定方式实现 Singleton 模式
在我们上面的示例中,使用了synchronized关键字来实现线程安全,但是synchronized关键字的缺陷比较明显,效率低下、性能瓶颈等问题。因此双重检查锁定方式实现Singleton模式就应运而生了。其实核心思想就是既保证线程安全又利用到了Java内存模型的特性。
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;
}
}
通过volatile关键字保证了instance在多线程情况下的可见性,进一步保证了线程安全。
总结
以上两个实现方式都是懒汉式的单例模式,它们有着各自的优缺点。在选择适合你应用程序的单例实现的时候,要根据实际情况选择。
对于多线程环境下单例模式的实现,我们强烈建议采用 Double-Checked Locking 方式,这可以确保线程安全,同时又能利用Java内存模型的优点,提高性能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java Signleton模式详解及示例代码 - Python技术站