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日

相关文章

  • 浅谈一下JVM垃圾回收算法

    浅谈一下JVM垃圾回收算法 简介 JVM(Java虚拟机)是Java程序的运行环境,其中的垃圾回收算法是JVM的核心组成部分。垃圾回收算法的目标是自动管理内存,释放不再使用的对象,以避免内存泄漏和提高程序性能。本文将介绍几种常见的JVM垃圾回收算法,并提供示例说明。 1. 标记-清除算法(Mark and Sweep) 标记-清除算法是最基本的垃圾回收算法之…

    other 2023年8月2日
    00
  • 关于r:为什么使用as.factor()而不是factor()

    以下是关于“关于R:为什么使用as.factor()而不是factor()”的完整攻略,包含两个示例说明。 为什么需要使用as.factor() 在R语言中,factor()函数将一个向量转换为因子。但是,如果我们使用factor()函数将一个字符向量转换为因子时,R语言会将字符向量的每个元素作为一个水平。这可能会导致我们得到一个不正确的因子。例如: &gt…

    other 2023年5月9日
    00
  • VUE多层路由嵌套实现代码

    VUE多层路由嵌套实现代码攻略 在Vue中,我们可以使用多层路由嵌套来构建复杂的应用程序。这种嵌套路由的实现方式可以帮助我们更好地组织和管理应用程序的不同页面和组件。 下面是一个详细的攻略,介绍了如何在Vue中实现多层路由嵌套。 步骤1:创建Vue项目和路由 首先,我们需要创建一个Vue项目并配置路由。可以使用Vue CLI来创建项目,然后使用Vue Rou…

    other 2023年7月27日
    00
  • c++virtualvoidvsnovirtual

    C++中virtual和非virtual函数的区别 在C++中,virtual和非virtual函数的区别在于是否支持多态。本文将详细讲解virtual和非virtual函数的区别,包括使用场景、实现方式、示例等内容。 virtual函数 在C++中,virtual函数是支持多态的。当一个类中的函数被声明为virtual时,可以被子类重写,从而实现多态。以下…

    other 2023年5月8日
    00
  • android之计时器(Chronometer)的使用以及常用的方法

    Android之计时器(Chronometer)的使用以及常用的方法 简介 Chronometer 是 Android 中的一个计时器控件,它可以用于显示和管理时间的计时。本攻略将详细介绍如何在 Android 应用中使用 Chronometer 控件,并提供一些常用的方法示例。 步骤 步骤 1: 在布局文件中添加 Chronometer 控件 首先,在你的…

    other 2023年8月21日
    00
  • Python基础教程之if判断,while循环,循环嵌套

    Python基础教程之if判断,while循环,循环嵌套攻略 本攻略将详细讲解Python中的if判断、while循环和循环嵌套的用法和示例。这些是Python编程中非常重要的基础知识,掌握它们可以帮助你编写更加灵活和高效的代码。 if判断 if判断是一种条件语句,用于根据条件的真假执行不同的代码块。它的基本语法如下: if 条件: # 条件为真时执行的代码…

    other 2023年7月28日
    00
  • python 子类调用父类的构造函数实例

    当子类继承自父类时,可以通过调用父类的构造函数来初始化子类实例中的父类属性。 在Python中,可以使用super()函数来调用父类的构造函数。 下面是具体的步骤和示例说明: 1. 子类继承父类 首先,定义一个父类和一个子类: class Person: def __init__(self, name): self.name = name def say_h…

    other 2023年6月26日
    00
  • java基础的详细了解第五天

    下面是“Java基础的详细了解第五天”的完整攻略。 一、目的 在第五天,我们将学习Java中的常用集合类,包括List、Set、Map等。通过学习使用这些集合类的方法,可以更好地提高Java的编程效率和代码质量。 二、学习内容 在第五天学习Java的基础集合类的相关知识,主要包括: List集合类的使用 Set集合类的使用 Map集合类的使用 集合类的遍历和…

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