设计模式之单例模式
2024-01-03 19:27:18
单例模式(Singleton Pattern)
是 Java 中最简单的设计模式之一。
特点
- 单例类只有一个私有构造函数,防止外部直接创建实例。
- 单例类维护一个私有静态成员变量,用于保存唯一的实例。
- 提供一个公共的静态方法来获取该实例,通常称为 "getInstance()" 方法。
- 在 "getInstance()" 方法中,如果实例尚未创建,则创建一个新实例并返回;如果已经存在实例,则返回已有的实例。
单例模式懒汉式?
?
public class Singleton {
// 私有静态成员变量,用于保存唯一的实例
private static Singleton instance;
// 私有构造函数,防止外部直接创建实例
private Singleton() {
// 初始化实例的操作
}
// 公共静态方法,用于获取唯一的实例
public static Singleton getInstance() {
// 懒汉式单例模式:如果实例尚未创建,则在第一次调用时创建实例
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
线程安全的单例模式(双重检查锁定)
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;
}
}
单例模式饿汉式
public class Singleton {
// 私有静态成员变量,用于保存唯一的实例,并在类加载时初始化
private static Singleton instance = new Singleton();
// 私有构造函数,防止外部直接创建实例
private Singleton() {
// 初始化实例的操作
}
// 公共静态方法,用于获取唯一的实例
public static Singleton getInstance() {
return instance;
}
}
懒汉式和饿汉式对比
懒汉式和饿汉式都是单例模式的实现方式,它们分别有不同的特点和适用场景。下面对懒汉式和饿汉式进行比较:
-
实例化时机:
- 懒汉式:在第一次使用时才会创建实例,即"懒加载"。这意味着如果在应用程序的生命周期内没有使用单例对象,那么实例不会被创建,可以节省内存。
- 饿汉式:在类加载时就会创建实例,即"急加载"。这意味着无论是否需要使用单例对象,实例都会在应用程序启动时创建,可能会浪费内存。
-
线程安全性:
- 懒汉式:最简单的懒汉式实现在多线程环境下可能存在线程安全问题,需要额外的同步措施来确保线程安全。可以使用双重检查锁定等机制来实现线程安全的懒汉式单例。
- 饿汉式:饿汉式单例在类加载时就创建实例,不存在多线程竞争的问题,因此是线程安全的。
-
性能:
- 懒汉式:由于需要在运行时检查是否需要创建实例,因此可能会引入性能开销。双重检查锁定等线程安全机制也会增加一些开销。
- 饿汉式:在类加载时创建实例,不需要额外的检查和同步,因此性能较好。
-
适用场景:
- 懒汉式:适用于需要延迟加载或者可能不会使用单例对象的情况。如果单例对象的创建和初始化比较耗时,可以选择懒汉式。
- 饿汉式:适用于需要确保全局唯一性,且单例对象的创建和初始化不会导致性能问题的情况。如果单例对象的创建代价较低,可以选择饿汉式。
综上所述,懒汉式和饿汉式各有优缺点,应根据具体的需求和性能要求来选择合适的实现方式。如果线程安全和性能是首要考虑因素,可以选择饿汉式;如果需要延迟加载或者考虑内存消耗,可以选择懒汉式,并确保在多线程环境下实现线程安全。
文章来源:https://blog.csdn.net/q12ERTYU/article/details/135342120
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!