单例模式定义:
单例模式(Singleton Pattern)是一种常用的软件设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式通常用于控制资源访问,如配置文件的读取、数据库的连接池等。
应用场景:
- 配置管理:应用程序中只需要一个配置管理器,通过它访问配置文件。
- 数据库连接池:数据库连接是昂贵的资源,通常需要限制连接数,使用单例模式管理连接池。
- 日志记录:通常整个应用程序只需要一个日志记录器来统一记录日志。
- 硬件接口访问:对于硬件资源的访问,如打印机或图形卡,通常只需要一个管理实例。
- 线程池:线程池的管理也是单例模式的一个典型应用。
单例模式的几种实现方式:
- 饿汉式(立即加载方式):
public class Singleton {
// 在自己内部定义自己一个实例,是不是很奇怪?
// 注意这是 private 只供内部调用
private static Singleton instance = new Singleton();
// 构造函数私有化
private Singleton() {}
// 这里提供了一个供外部访问本类实例的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
- 懒汉式(延迟加载方式):
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 双重检查锁定(Double-Checked Locking):
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;
}
}
- 静态内部类:
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
- 枚举实现:
public enum Singleton {
INSTANCE;
public void doSomething() {
// do some operation
}
}
注意事项:
- 在多线程环境下,确保单例的线程安全是非常重要的。
- 如果单例类持有外部资源,如 IO 或数据库连接,应该考虑资源的正确释放。
- 在分布式系统中,单例模式需要更复杂的实现来保证实例的全局唯一性。