Java编程中的设计模式:单例模式的深度剖析
实现单例模式有多种方式,最常见的包括懒汉式和饿汉式。懒汉式延迟实例的创建直到首次被引用,而饿汉式在类加载时就立即创建实例。
一个基本的懒汉式单例模式的代码:
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
在这个例子中,Singleton
类的构造函数是私有的,这防止了外部直接创建实例。getInstance()
方法确保只创建一个Singleton
实例,并在之后的调用中返回同一实例。
然而,这种实现在多线程环境中可能会遇到问题。如果两个线程同时执行getInstance()
方法,可能会导致创建多个实例。为了解决这个问题,可以在getInstance()
方法前加上synchronized
关键字,但这会降低性能,因为每次调用都要进行线程同步。
更高效的方法是使用“双重检查锁定”模式:
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;}
}
在这里,volatile
关键字确保了instance
的多线程可见性。只有当instance
为null时,才进行同步,这大大减少了同步的开销。