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

yizhihongxing

下面我会为大家详细讲解“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日

相关文章

  • git篇—创建远程仓库

    Git篇:创建远程仓库的完整攻略 在使用Git进行版本控制时,我们通常需要将本地仓库同步到远程仓库中,以便多人协作开发或备份代码。下面是创建远程仓库的完整攻略,包括两个示例说明。 步骤1:创建远程仓库 首先,我们需要在Git托管平台上创建一个远程仓。以GitHub为例,我们可以按照以下步创建一个远程仓库: 登录GitHub账号,进入主页。 点击右上角的“+”…

    other 2023年5月9日
    00
  • web面试之JS预解析与变量提升区别

    JS预解析与变量提升区别 在JS代码执行之前,浏览器会对JS代码进行预编译,其中有两个非常重要的步骤,分别是JS预解析和变量提升。虽然它们都涉及到JS代码的解析和执行顺序,但它们的作用和执行过程有所不同,下面我们来详细讲解它们之间的区别。 JS预解析 当浏览器解析JS代码时,它会在执行之前,先把所有的var关键字以及函数的声明提取到当前作用域的顶部,而不是按…

    other 2023年6月27日
    00
  • 关于java:atscala项目 编译器错误-无法解析符号列表?

    Java:atscala项目编译器错误-无法解析符号列表 在Java开发中,有时会遇到编译器错误,例如“无法解析符号列表”。这种错误通常是由于缺少依赖项或类路径引起的。以下是关于Java:atscala项目编译器错误-无法解析符号列表的完整攻略,包括常见问题和两个示例说明。 常见问题 1. 缺少依赖项 在Java开发中,如果项目依赖于其他库或框架,但缺少这些…

    other 2023年5月9日
    00
  • PHP学习笔记(二):变量详解

    PHP学习笔记(二):变量详解 在这篇学习笔记中,我们将深入了解PHP中的变量。变量是存储数据的容器,可以在程序中使用和操作。我们将学习如何声明变量、给变量赋值、以及如何使用变量进行计算和输出。 声明变量 在PHP中,可以使用$符号来声明一个变量。变量名由字母、数字和下划线组成,且不能以数字开头。以下是一个声明变量的示例: $name = \"Jo…

    other 2023年8月8日
    00
  • 群晖存储空间选哪个格式

    以下是“群晖存储空间选哪个格式的完整攻略”的详细说明,包括过程中的两个示例说明。 群晖存储空间选哪个格式的完整攻略 在群晖存储空间中,有多种格式可供选择。不同格式具有不同的优缺点,因此需要根据实际需求选择合适的格式。以下是一份关于群晖存储空间选哪个格式的完整攻略。 1. Btrfs Btrfs是一种先进的文件系统格式,具有许多优点,例如: 支持快照和克隆,可…

    other 2023年5月10日
    00
  • js编码、解码

    以下是关于“JavaScript编码、解码”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 在JavaScript中,编码和解码是指将字符串转换为URL安全的格式或将URL安全的格式转换为字符串的过程。编码通常用于将字符串作为URL参数发送到服务器,而解码则用于从服务器接收URL参数并将其转换为JavaScript中的字符串。 步骤 以下是在JavaS…

    other 2023年5月7日
    00
  • vmware虚拟机各个版本的安装破解

    对于网站的作者来说,我们不会提供任何破解软件或者方式的介绍。同时,我们也不支持任何非法破解软件的使用,因此在这里我们只对虚拟机的安装做简要的介绍。 VMware是一款虚拟机软件,可以在电脑上运行多个操作系统。它的安装总体分为三个阶段:下载软件安装包、安装软件、配置软件。 下载软件安装包 进入VMware官网,选择适合您电脑的操作系统的版本进行下载。在下载进度…

    其他 2023年4月16日
    00
  • 果粉必看!50个苹果iOS9实用小技巧汇总(全部一一验证)

    果粉必看!50个苹果iOS9实用小技巧汇总(全部一一验证)攻略 1. 使用Spotlight搜索 在iOS 9中,你可以使用Spotlight搜索功能来快速找到你需要的应用、联系人、音乐等。只需在主屏幕上向下滑动,然后在搜索栏中输入关键词即可。 示例说明:如果你想找到名为“Evernote”的应用,只需在Spotlight搜索栏中输入“Evernote”,然…

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