单例模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类仅有一个实例,并提供一个全局访问点。以下是单例模式的一些关键知识点:
1.定义与目的
- 确保一个类只有一个实例,并提供一个全局访问点。
- 在软件系统中,经常有需要这样一个特殊类,它负责管理系统中的重要资源(如数据库连接、文件系统等),保证在系统中只有一个实例存在,避免出现多个实例之间的状态不一致问题。
2.实现方式
- 饿汉式(静态常量):在类加载时就完成了实例化,避免了线程同步问题。
java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
- 懒汉式 (双重检查锁定):在第一次调用
getInstance()
方法时才进行实例化,并使用了双重检查锁定来避免多次同步。
java
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;
}
}
- 静态内部类:利用了classloader的机制来保证初始化instance时只有一个线程。
java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
- 枚举:利用枚举的特性,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
java
public enum Singleton {
INSTANCE;
// 其他方法...
}
3.适用场景:
- 当一个类只能有一个实例,而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
4.注意事项
- 构造函数必须私有,以防止其他类通过new关键字创建实例。
- 考虑线程安全,特别是在懒汉式实现中。
- 考虑序列化问题,防止反序列化时重新创建对象。
5.优缺点
- 优点:
- 在内存中只有一个对象,减少了内存开销。
- 避免了对资源的多重占用。
- 可以在系统设置全局的访问点,优化和共享资源访问。
- 缺点:
- 没有接口,扩展困难。
- 在并发测试时,可能出现多个Singleton实例。
6.使用场景
- 数据库连接池、缓存管理、线程池等。
- Windows的任务管理器就是一个单例模式,同时只能打开一个窗口。