每日一题:单例模式
每日一题:单例模式
❝单例模式是确保一个类只有一个实例,并提供一个全局访问点
1.饿汉式(静态常量)
特点:在类加载时就创建了实例。
优点:简单易懂,线程安全。
缺点:无论是否使用,都会加载实例。
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
2. 懒汉式(线程不安全)
特点:在第一次调用 getInstance() 方法时创建实例。
优点:按需创建实例。
缺点:线程不安全。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
备注:线程安全可以直接使用synchronized加在方法上。
3. 懒汉式(双重检查锁定)
特点:在第一次调用 getInstance() 方法时创建实例,使用双重检查锁定保证线程安全。
优点:按需创建实例,线程安全。
缺点:稍微复杂一些。
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;
}
}
4. 静态内部类
特点:利用 Java 的类加载机制保证单例的唯一性。
优点:懒加载,线程安全。
缺点:稍微复杂一些
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
5. 枚举
特点:利用枚举类型的特性实现单例。
优点:简洁,线程安全。
缺点:不太常用。
public enum Singleton {
INSTANCE;
public void Method() {
//实现方法
System.out.println("实现方法")
}
}
总结
❝单例模式确保一个类就只有一个实例,提供一个全局的访问点。确保一个类只有一个实例:类构造器私有化,避免其他地方可以new对象。提供一个全局的访问点:静态化私有变量,以及提供一个静态方法返回实例。需要考虑线程是否安全,以及为了避免浪费资源,线程安全问题,考虑互斥性,原子性,可见性。
往期推荐
大型语言模型(Large Language Model, LLM)了解一下?
原文地址:https://blog.csdn.net/qq_37400096/article/details/142800360
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!