0
点赞
收藏
分享

微信扫一扫

【docker】一行指令删除 none 镜像

文章目录

1.概念

1.1 什么是单例模式

单例模式属于创建型模式,一个单例类在任何情况下都只存在一个实例
构造方法必须是私有的、由自己创建一个静态变量存储实例,对外提供一
个静态公有方法获取实例。

1.2 优点与缺点

优点:是内存中只有一个实例,减少了开销,尤其是频繁创建和销毁实例的情况下,可以避免对资源的多重占用。
缺点:没有抽象层,难以扩展,与单一职责原则冲突(单例模式由于其全局访问的特性,往往会使得类的使用变得非常广泛,这会导致类的职责膨胀,变得越来越难以维护。)。

2.实现方式

2.1 懒汉式

2.1.1 懒汉式(线程不安全)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

2.1.2 懒汉式(线程安全)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

2.2 饿汉式

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

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

2.3 双重检查锁定(Double-Checked Locking)

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

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

volatile关键字的作用是确保instance变量的可见性和防止指令重排序。

2.4 静态内部类

public class Singleton {
    private Singleton() {}

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

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

在这个示例中,SingletonHolder是一个静态内部类,它包含了一个静态的Singleton实例。SingletonHolder类只有在getInstance()方法被调用时才会被加载,这保证了Singleton实例的延迟加载。同时,由于类的加载过程是线程安全的,所以这种方式也保证了单例的线程安全。

2.5 枚举

public enum Singleton {
    INSTANCE1,
    INSTANCE2;
    
    public void someMethod() {
        // 功能处理
        System.out.println("执行一些功能处理");
    }
}
public class Main {
    public static void main(String[] args) {
        // 调用第一个枚举实例的方法
        Singleton.INSTANCE1.someMethod();
        
        // 调用第二个枚举实例的方法
        Singleton.INSTANCE2.someMethod();
    }
}

3 Java 哪些地方用到了单例模式

4 Spring 哪些地方用到了单例模式

举报

相关推荐

0 条评论