裴大头-秦可爱

裴大头-秦可爱

Java 23种设计模式——单例模式(Singleton)

发表于 2023-11-08
裴大头
阅读量 995
更新于 2023-11-08

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

实现单例模式

在 Java 中,实现单例模式有多种方式,以下是其中两种比较常见的方式:

1. 饿汉式单例模式

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}
java

在饿汉式单例模式中,实例在类加载的时候就创建好。这样做的优点是实现简单,线程安全,但缺点是如果这个实例很大却没有被使用,会造成资源的浪费。

2. 懒汉式单例模式

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

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

懒汉式单例模式在第一次获取实例的时候才进行实例化,它的优点是避免了资源浪费,但缺点是在多线程环境下会存在性能问题,因为在getInstance方法上加了synchronized关键字,导致每次调用都要进行同步操作。

当在懒汉式单例模式中加入双重检查锁(Double-Checked Locking)时,可以更好地解决多线程环境下的性能问题。以下是加入双重检查锁的懒汉式单例模式示例:

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

应用场景

单例模式通常在以下场景中使用:

  • 对于频繁使用的对象,可以省去创建对象所消耗的时间,提高性能。
  • 控制资源的使用,例如数据库连接池等。

总结

单例模式是设计模式中的经典之一,它可以确保一个类只有一个实例,提供全局访问点,以及控制资源的有效利用。在实际应用中,需要根据具体的业务场景和性能要求选择合适的单例模式实现方式。 希望本文对你理解 Java 单例模式有所帮助。

Java 23种设计模式(含源码)

评论
来发一针见血的评论吧!
表情
  • 裴大头

    男博主

    IP:济南市

    2023-11-08 17:23

    饿汉式单例模式
    优点:
    线程安全: 在类加载的时候就创建了实例,因此不存在多线程环境下的竞态条件,保证了线程安全。
    简单易实现: 实现简单直接,代码量少。
    缺点:
    资源浪费: 如果这个实例很大却没有被使用,会造成资源的浪费。
    无法延迟加载: 无法实现延迟加载,造成在应用程序启动时就创建对象,如果该对象占用资源较多或者初始化耗时较长,会影响应用程序启动速度。
    懒汉式单例模式
    优点:
    延迟加载: 在第一次获取实例时才进行实例化,避免了不必要的资源浪费,可以在需要的时候再创建实例。
    资源利用率高: 节约了系统资源,提高了资源利用率。
    缺点:
    非线程安全: 原始的懒汉式单例在多线程环境下会存在线程安全问题,需要加入同步机制来解决。
    性能问题: 在多线程环境下,需要进行同步操作,可能引起性能问题。
    总结
    选择饿汉式或懒汉式单例模式取决于具体的业务场景和需求。饿汉式适用于对资源要求严格、希望尽快获取对象的场景;而懒汉式适用于希望延迟加载、节约资源的场景。

    另外,针对懒汉式的线程安全和性能问题,可以使用双重检查锁(Double-Checked Locking)或者静态内部类等方式来解决。

    0
    回复
      共0条回复,点击查看
推荐文章
  • Vue项目代码规范

    1点赞1评论

  • 聊一聊我的文本编辑器

    1点赞11评论

  • JavaScript的常用遍历方法整理

    1点赞8评论

  • 前端面试精选-基础篇

    1点赞0评论

  • JavaScript 的事件循环机制

    1点赞1评论

Crafted with by Pei你看雪

小破站居然运行了 846 天访客 22582

© 2023 Pei你看雪鲁ICP备19037910号-2