问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

掌握单例模式,面试不愁!

创作时间:
作者:
@小白创作中心

掌握单例模式,面试不愁!

引用
CSDN
9
来源
1.
https://blog.csdn.net/weixin_45031801/article/details/141688276
2.
https://blog.csdn.net/qq_53915616/article/details/139420309
3.
https://blog.csdn.net/shenfenxihuan/article/details/138493185
4.
https://blog.csdn.net/ljx1400052550/article/details/139509099
5.
https://blog.csdn.net/2501_90242333/article/details/145085027
6.
http://ce-dong.net/article.asp?pid=202&id=695
7.
https://cloud.tencent.com/developer/article/2419385
8.
https://developer.aliyun.com/article/1496472
9.
https://cloud.tencent.com/developer/article/2398622

在软件开发领域,单例模式是最常用的设计模式之一,特别是在面试中,它几乎是必考知识点。掌握单例模式不仅能帮助你写出更高质量的代码,还能在面试中给面试官留下深刻印象。本文将深入解析单例模式的核心思想、实现方式及其在实际开发中的应用场景。

01

什么是单例模式?

单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制资源访问、管理共享资源、控制实例数量等场景下非常有用。

单例模式的核心目标是:

  1. 确保一个类只有一个实例
  2. 提供一个全局访问点
  3. 避免频繁创建对象导致的性能开销
02

单例模式的实现方式

单例模式有多种实现方式,每种方式都有其特点和适用场景。下面将介绍几种常见的实现方式:

1. 懒汉式(线程不安全)

懒汉式单例模式在第一次使用时才创建实例,这样可以节省内存资源。但这种实现方式在多线程环境下可能会出现问题。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2. 懒汉式(线程安全)

为了解决线程安全问题,可以在getInstance方法上加锁,但这会影响性能。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3. 饿汉式

饿汉式单例模式在类加载时就创建实例,确保了线程安全,但可能会造成资源浪费。

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

4. 双重检查锁定(DCL)

双重检查锁定模式结合了懒汉式和饿汉式的优点,既保证了线程安全,又避免了性能损失,是推荐的实现方式。

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;
    }
}

5. 静态内部类

静态内部类方式利用了Java类加载机制保证初始化实例时只有一个线程,既保证了线程安全,又避免了同步带来的性能开销。

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {}

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

6. 枚举单例

Java枚举类型天然支持单例模式,既简单又安全。

public enum Singleton {
    INSTANCE;

    public void someMethod() {
        // ...
    }
}
03

单例模式的应用场景

单例模式在实际开发中有着广泛的应用,以下是一些常见的场景:

  1. 数据库连接池:在整个应用程序中只需要一个连接池实例,避免频繁创建和销毁连接。

  2. 日志记录器:确保所有模块使用同一个日志记录器,便于统一管理和配置。

  3. 配置文件管理器:避免重复读取配置文件,提高效率。

  4. 线程池:提高线程复用率,减少创建和销毁的开销。

  5. 全局资源管理器:如文件系统、网络连接等全局唯一资源的管理。

04

总结

掌握单例模式不仅能帮助你写出更高质量的代码,还能在面试中给面试官留下深刻印象。在实际开发中,推荐使用双重检查锁定或枚举方式实现单例模式,它们既保证了线程安全,又具有较好的性能。希望本文能帮助你更好地理解和应用这一经典设计模式。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号