Java编程中的单例模式
在Java中实现单例模式有几种方式,但最常见的是懒汉式和饿汉式。我们先来看一个简单的懒汉式实现:
public class Singleton {private static Singleton instance;private Singleton() {} // 构造方法私有化,防止外部实例化public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
这种方式的特点是在第一次调用getInstance()
方法时才会创建实例,实现了懒加载。但是,这种方式在多线程环境中可能会创建多个实例,因此不是线程安全的。
为了解决这个问题,我们可以使用双重检查锁定(DCL):
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
的值来保证只创建一个实例。
除了懒汉式,还有饿汉式实现,它在类加载时就完成了实例化,因此天生是线程安全的:
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {} // 构造方法私有化,防止外部实例化public static Singleton getInstance() {return instance;}
}
饿汉式的优点是简单且线程安全,但如果该实例占用资源较多,而应用中实际并未使用到,就会造成资源的浪费。