Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java写一个单例模式


在 Java 中实现单例模式有多种方式,下面将介绍五种常见的实现方式,并提供相应的步骤流程和示例代码。

饿汉式(Eager Initialization)

在类加载时就创建实例,保证线程安全。适用于实例创建开销较小的情况。

步骤流程:

  1. 创建私有静态成员变量来保存单例实例。
  2. 私有化构造方法,防止外部创建新实例。
  3. 提供公共静态方法获取单例实例,如果实例为空则创建。

示例代码:

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {
        // 私有构造方法
    }

    public static EagerSingleton getInstance() {
        return instance;
    }
}

懒汉式(Lazy Initialization)

延迟加载实例,直到首次访问时创建。需要注意线程安全性问题。

步骤流程:

  1. 创建私有静态成员变量来保存单例实例(初始值为 null)。
  2. 私有化构造方法。
  3. 提供公共静态方法获取单例实例,在方法内部进行懒加载判断和创建。

示例代码:

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {
        // 私有构造方法
    }

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

双重检查锁(Double-Checked Locking)

结合懒汉式和同步锁,提高性能。需要考虑指令重排问题。

步骤流程:

  1. 创建私有静态成员变量来保存单例实例(初始值为 null)。
  2. 私有化构造方法。
  3. 提供公共静态方法获取单例实例,使用双重检查锁,保证在实例为空时才进行同步创建。

示例代码:

public class DoubleCheckedSingleton {
    private static volatile DoubleCheckedSingleton instance;

    private DoubleCheckedSingleton() {
        // 私有构造方法
    }

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

静态内部类(Static Inner Class)

利用类加载机制和静态内部类的特性,实现懒加载和线程安全。

步骤流程:

  1. 创建私有静态内部类,内部类持有单例实例并在类加载时初始化。
  2. 外部类提供公共静态方法获取内部类的实例。

示例代码:

public class StaticInnerSingleton {
    private StaticInnerSingleton() {
        // 私有构造方法
    }

    private static class SingletonHolder {
        private static final StaticInnerSingleton instance = new StaticInnerSingleton();
    }

    public static StaticInnerSingleton getInstance() {
        return SingletonHolder.instance;
    }
}

枚举(Enum)

枚举实现的单例模式是线程安全的,并且可以防止反序列化和反射攻击。

步骤流程:

创建一个单例枚举,枚举元素即为单例实例。

示例代码:

public enum EnumSingleton {
    INSTANCE;

    // 添加其他方法和成员变量
}

这里列举的是常见的几种单例模式的实现方式。注意在实际开发中,选择适合场景和性能要求的方式很重要。

对于 Maven 和 Gradle 的依赖,以上示例代码不需要依赖任何第三方库,因此不需要特定的依赖坐标。

下面我将介绍几种常见的实现方式,包括使用原生JavaAPI、ApacheCommonsIO库、以及NIO(NewI/O)库。示例代码:以上是 ...
访问者模式(VisitorPattern)是一种行为型设计模式,它用于在不修改现有对象结构的情况下,定义用于操作这些对象的新操作。在客户端中 ...
###使用FileOutputStream这是一种基本的文件写入方式,可以将数据写入字节流中,然后写入到文件中。示例代码:###使用File ...
Django是一种使用Python编写的高级Web框架,它采用了MTV模式,即模型(Model),模板(Template),视图(View) ...
在Django中,MTV模式是一种软件设计模式,它有助于将应用程序的逻辑分层和组织,使得应用程序易于维护和扩展。T(模板-Template) ...