欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > 每日一题:单例模式

每日一题:单例模式

2024/11/30 13:04:40 来源:https://blog.csdn.net/qq_37400096/article/details/142800360  浏览:    关键词:每日一题:单例模式

每日一题:单例模式

单例模式是确保一个类只有一个实例,并提供一个全局访问点

7f3ba8dd532ba47c2e1c2a7930ef9a79.png

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对象。提供一个全局的访问点:静态化私有变量,以及提供一个静态方法返回实例。需要考虑线程是否安全,以及为了避免浪费资源,线程安全问题,考虑互斥性,原子性,可见性

往期推荐

每日一题:青蛙跳台阶问题

Mysql优化相关学习(1)

Mysql8.0安装以及递归表达式使用

一文带你springai+ollama实现chat

大型语言模型(Large Language Model, LLM)了解一下?


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com