单例模式
2025年6月10日大约 1 分钟
单例模式
使用场景:配置类,日志记录,线程池
- 单例模式下,一个类只有一个实例(new 出来的对象),并提供一个全局访问点。
- 单例设计模式又分成两种,饿汉式和懒汉式。
1.饿汉式
对象实例在类加载的时候就创建出来了
- 优点:类加载的过程中是线程安全的
- 缺点:因为创建的时间早,如果没有被使用则造成资源浪费
public class Singleton {
private static final Singleton instance = new Singleton(); //类加载时创建
// 私有构造器,防止外部new (因为全局只能有一个对象实例,防止通过构造器创建多个对象实例)
private Singleton() {
}
//给对象实例提供一个全局访问点
public static Singleton getInstance() {
return instance;
}
}
2.懒汉式
对象实例只有在首次使用对象的时候才会创建出来(比较懒!)
- 优点:使用才创建节省资源
- 缺点:有线程安全问题,可能会出现对个实例的创建。(因为在创建对象实例前会先判断实例是否已经存在,此时如果并发请求则判断结果都为未创建,导致多个线程都创建了这个对象实例,即为出现线程安全问题 )
==并发问题改进方案:双重检查锁(DCL)+ volatile ==
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次检查
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查
instance = new Singleton();
}
}
}
return instance;
}
}