单例模式

最简单版(饿汉式)。 通过static的静态初始化方式,在该类第一次被加载的时候,该对象的实例就被创建出来了

复制代码
public class Singleton {
    //实例化
    private static Singleton instance = new Singleton();
    //私有构造方法
    private Singleton(){}
    //对外提供获取实例的静态方法
    public static Singleton getInstance() {
        return instance;
    }
}
复制代码

第一种方式,如果较多的单例采用上述方式的话,可以回造成不必要的浪费。可采用另外两种方式来避免该种情况

 

静态内部类方式,通过显式调用方法是,才会装载单例对象,从而实例化

复制代码
public class Singleton {
    //在静态内部类中初始化实例对象
    private static class InnerSingleton {
        private static final Singleton instance = new Singleton();
    }
    //私有构造方法
    private Singleton(){}
    //获取实例的静态方法
    public static Singleton getInstance() {
        return InnerSingleton.instance;
    }
}
复制代码

懒汉模式方式

复制代码
public class Singleton {
    //实例
    private static Singleton instance;
    //私有构造方法
    private Singleton(){}
    //获取实例的静态方法
    public static Singleton getInstance() {
        if(instance == null) {
      synchronized(Singleton.class) {
               if(instance == null) {
                   instance = new Singleton();
               }
      }
            
        }
        return instance;
    }
}
复制代码

网上说序列化的情况下,可能会破坏单例,解决方法是重写readResolve方法。没有试验过

public class Singleton implements Serializable{
    private volatile static Singleton singleton;
    private Singleton (){}
    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

    private Object readResolve() {
        return singleton;
    }
}

 

posted @   秋水秋色  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示