Java版的7种单例模式写法示例

下面我会为大家详细讲解“Java版的7种单例模式写法示例”的完整攻略。

标题一:什么是单例模式?

单例模式是一种常用的软件设计模式,在单例模式中,一个类只允许创建一个对象实例,所有其他对象都必须引用该对象实例。单例模式具有如下特点:

  • 单例类只有一个实例对象。
  • 该单例对象必须由单例类自行创建。
  • 单例类对外提供一个访问该单例的全局访问点。

标题二:Java版的7种单例模式写法示例

下面是Java版的7种单例模式写法示例:

饿汉式(线程安全,调用效率高,但是不能延时加载)

public class Singleton1 {
    private static Singleton1 instance = new Singleton1();
    private Singleton1(){}
    public static Singleton1 getInstance(){
        return instance;
    }
}

懒汉式(线程不安全,在多线程不能正常工作)

public class Singleton2 {
    private static Singleton2 instance;
    private Singleton2(){}
    public static Singleton2 getInstance(){
        if(instance == null){
            instance = new Singleton2();
        }
        return instance;
    }
}

懒汉式(线程安全,效率低,可以延时加载)

public class Singleton3 {
    private static Singleton3 instance;
    private Singleton3(){}
    public static synchronized Singleton3 getInstance(){
        if(instance == null){
            instance = new Singleton3();
        }
        return instance;
    }
}

双重校验锁(线程安全,支持延迟加载)

public class Singleton4 {
    private volatile static Singleton4 instance;
    private Singleton4(){}
    public static Singleton4 getInstance(){
        if(instance == null){
            synchronized (Singleton4.class){
                if(instance == null){
                    instance = new Singleton4();
                }
            }
        }
        return instance;
    }
}

静态内部类(线程安全,调用效率高,支持延时加载)

public class Singleton5 {
    private Singleton5(){}
    private static class SingletonHolder{
        private static final Singleton5 INSTANCE = new Singleton5();
    }
    public static final Singleton5 getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

枚举(线程安全,调用效率高,不能延时加载,可以防止反射创建多个实例)

public enum Singleton6 {
    INSTANCE;
    public void whateverMethod(){
    }
}

饿汉式(终极版,可防止反射和序列化漏洞)

public enum Singleton7 {
    INSTANCE;
    public void whateverMethod(){
    }

    private static void destroy() {
        try {
            Field singletonDecl = INSTANCE.getClass().getDeclaredField("INSTANCE");
            singletonDecl.setAccessible(true);
            singletonDecl.set(null, null);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    private Object readResolve() {
        return INSTANCE;
    }

    static {
        Runtime.getRuntime().addShutdownHook(new Thread(Singleton7::destroy));
    }
}

附加说明

以上7种单例模式的写法,饿汉式、懒汉式、双重校验锁和静态内部类都属于比较常见的写法。枚举和饿汉式终极版是比较特殊的写法,不是很常用,但是使用的时候需要注意一些特殊情况。

除此之外,还需要注意到这些单例写法的优缺点。例如,饿汉式的优点是线程安全、调用效率高,缺点是不能延时加载;懒汉式的缺点在多线程情况下不能正常工作,而双重校验锁虽然线程安全,但是效率会比较低。我们在使用的时候需要根据具体的情况选择适合自己业务场景的单例写法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java版的7种单例模式写法示例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 什么是命令提示符 命令提示符的打开方法

    当我们需要在操作系统中执行一些基本的命令时,可以通过命令提示符控制台来实现。命令提示符为用户提供了一个简单而强大的方式来与计算机交互,同时也很容易进行脚本编写和批量处理等高级操作。 下面是打开命令提示符的方法及示例说明: 命令提示符的打开方法 在Windows系统中 在Windows系统中,命令提示符可以通过以下方式打开: 使用快捷键Win+R,弹出运行窗口…

    other 2023年6月26日
    00
  • githubdesktop下载及使用

    GitHub Desktop 下载及使用 简介 GitHub Desktop 是一款 GitHub 官方提供的桌面应用程序,它可以帮助用户更加方便地管理 Github 上的代码仓库,支持 Windows 和 macOS 两种操作系统,具有以下特点: 可以直接从 GitHub 上克隆或创建代码仓库 支持本地修改、提交和推送代码到远程代码仓库 支持多个账户登录管…

    其他 2023年3月28日
    00
  • Java中实现String字符串分割的3种方法

    下面是Java中实现String字符串分割的3种方法的详细攻略: 1. String的split方法 1.1 整理问题 在Java中,String类提供了一个用于字符串分割的方法,即split()方法。该方法可以将一个字符串按照指定的分隔符切分成若干子串,并将其存入一个字符串数组返回。 1.2 解决问题 split()方法接受一个正则表达式作为参数,用于指定…

    other 2023年6月20日
    00
  • 批处理中常用命令介绍(Echo、rem、goto、call、pause、if、for)

    批处理是一种批量处理脚本语言,它可以帮助用户重复地执行一系列命令。在批处理过程中,常用的一些命令有Echo、rem、goto、call、pause、if、for,下面我将详细讲解这些命令的用法。 Echo命令 Echo 命令是将字符串输出到屏幕上的命令,通常用于脚本输出提示信息或者调试信息。它有以下两种语法: Echo [message] Echo.[mes…

    other 2023年6月26日
    00
  • Lua教程(十四):字符串库详解

    Lua教程(十四):字符串库详解 1. 简介 Lua字符串库提供了丰富的字符串操作函数,包括格式化输出、字符串查找和替换、字符串截取和连接等。本教程将详细讲解字符串库中主要的函数用法,并给出代码示例作为说明。 2. 字符串格式化 字符串格式化是在输出时将一些变量插入到固定文本中,通常用于调试或显示结果。Lua中的字符串格式化函数为string.format(…

    other 2023年6月20日
    00
  • c#winform窗口页面一打开就加载的实现方式

    要在C# WinForm窗口页面一打开就加载某个操作/动作,我们可以使用窗口的Load事件。窗口Load事件在窗口第一次展示时被触发,因此在这个事件中编写的代码会在窗口首次加载时执行。 以下是具体实现步骤和示例说明: 在窗口中加入一个Load事件 我们可以在设计模式下,单击窗口,或选中窗口的属性,选择“事件”图标,然后在下拉列表中找到“Load”事件。双击它…

    other 2023年6月25日
    00
  • mybatis实体类字段大小写及字段获取不到值问题

    当然!下面是关于\”mybatis实体类字段大小写及字段获取不到值问题\”的完整攻略: mybatis实体类字段大小写及字段获取不到值问题 在使用 MyBatis 进行数据库操作时,可能会遇到实体类字段大小写不一致或字段获取不到值的问题。以下是两个示例: 示例1:实体类字段大小写不一致问题 在数据库表和实体类字段命名不一致的情况下,可以通过在 SQL 映射文…

    other 2023年8月19日
    00
  • php设计模式 Template (模板模式)

    PHP设计模式中的模板模式 (Template Pattern) 是一种行为设计模式,它定义了一套算法流程,将某个流程中的某些步骤延迟到子类中实现,保留待子类实现的步骤,以此来实现代码重用和解耦的效果。 模板模式包含两类方法:具体方法和抽象方法。具体方法是这个模板流程中的固定步骤,而抽象方法则是需要子类实现的步骤。 在PHP中实现模板模式,一般需要定义一个抽…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部