在软件开发中,我们经常会遇到这样的场景:某个类只需要一个实例,并且这个实例需要在整个应用程序中共享。例如,数据库连接池、日志记录器、配置文件管理器等。如果创建多个实例,不仅会造成资源浪费,还可能导致数据不一致等问题。单例模式(Singleton Pattern)是一种常见的设计模式,它确保类在整个应用程序中只有一个实例,并提供一个全局访问点。
一、单例模式的实现方式
单例模式的实现方式从实例化时机,线程安全性角度,可以分为6种:饿汉式、懒汉式-线程非安全、同步锁-线程安全、双重检查加锁-线程安全、静态内部类、枚举。
1.饿汉式
public class Singleton {
// 类加载时就创建实例
private static final Singleton instance = new Singleton();
// 私有化构造函数,防止外部创建实例
private Singleton() {}
// 提供全局访问点
public static Singleton getInstance() {
return instance;
}
}
优点: 实现简单,线程安全。
缺点: 类加载时就创建实例,如果实例一直没有被使用,会造成资源浪费。
注:
final
关键字修饰的变量一旦被赋值,就不能再被修改。在这里,instance
被声明为final
,意味着它一旦被初始化为Singleton
的实例,就不能再指向其他对象。
2.懒汉式-线程非安全
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
优点: 延迟加载,只有在第一次使用时才会创建实例。
缺点: 线程不安全,多线程环境下可能会创建多个实例。
为什么线程不安全:在多线程环境中,多个线程可能同时进入 getInstance()
方法,并同时检测到 instance == null
,从而导致
回复