0
点赞
收藏
分享

微信扫一扫

Java 懒汉模式详解

乱世小白 2024-11-18 阅读 3

懒汉模式(Lazy Initialization)是一种设计模式,用于延迟初始化对象,直到实际需要时才进行初始化。这种模式在多线程环境下特别有用,可以避免不必要的资源消耗。本文将详细介绍懒汉模式的几种实现方式,并讨论其优缺点。

  1. 非线程安全的懒汉模式

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

优点:

实现简单。

缺点:

在多线程环境下不安全,可能会创建多个实例。

  1. 线程安全的懒汉模式(使用 synchronized)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

优点:

线程安全。

缺点:

性能较差,每次调用 getInstance 方法都会进行同步,即使实例已经创建。

  1. 双重检查锁定(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;
    }
}

优点:

线程安全。

性能较好,只有在第一次创建实例时进行同步。

缺点:

实现稍微复杂一些。

  1. 静态内部类

public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

优点:

线程安全。

实现简单。

延迟初始化。

缺点:

无明显缺点。

  1. 枚举实现

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // 业务逻辑
    }
}

优点:

线程安全。

防止反序列化重新创建新的对象。

实现简单。

缺点:

不够灵活,不能自定义构造函数。

总结

懒汉模式通过延迟初始化对象来节省资源,但在多线程环境下需要特别注意线程安全问题。不同的实现方式各有优缺点,选择合适的实现方式取决于具体的应用场景和需求。常见的实现方式包括非线程安全的懒汉模式、线程安全的懒汉模式、双重检查锁定、静态内部类和枚举实现。其中,静态内部类和枚举实现是最推荐的方式,因为它们既简单又高效。

举报

相关推荐

0 条评论