单例模式实现方法

单例模式常见的实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。

(1)饿汉模式

饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安全问题,它的实现代码如下:

点击查看代码
public class Singleton1 {

    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton1(){}
    // 2.通过私有变量保存单例对象
    private static Singleton1 instance=new Singleton1();
    // 3.提供公共获取单例对象的方法
    public static Singleton1 getInstance(){
        return instance;
    }
}
优点:实现简单、不存在线程安全问题。 缺点:类加载时就创建了对象,创建之后如果没被使用,就造成了资源浪费的情况。

(2)懒汉模式

懒汉模式和饿汉模式正好相反的,所谓的懒汉模式指的是懒加载(延迟加载),只有在第一次被使用时,才会被初始化,它的实现代码如下:

点击查看代码
public class Singleton2 {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton2(){}
    // 2.通过私有变量保存单例对象
    private static volatile Singleton2 instance=null;
    // 3.提供公共获取单例对象的方法
    public static Singleton2 getInstance(){
        if(instance==null){//第一次检验
            synchronized (Singleton2.class){
                if(instance==null){//第二次检验
                    instance=new Singleton2();
                }

            }
        }
        return instance;
    }
}
懒汉模式使用的是双重效验锁和 volatile 来保证线程安全的,相比于饿汉模式来说,不会造成资源的浪费,但写法要复杂一些

(3)静态内部类

静态内部类既能保证线程安全,又能保证懒加载,它只有在被调用时,才会通过 ClassLoader 机制来加载和初始化内部静态类,因此它是线程安全的,此模式的实现代码如下:

点击查看代码
public class Singleton3 {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton3(){}
    //2.静态内部类
    private static class SingletonHolder{
        private static final Singleton3 singleton3=new Singleton3();
    }
    //3.提供公共获取单例对象的方法
    public static final Singleton3 getInstance(){
        return SingletonHolder.singleton3;
    }
}

(4)枚举

枚举也是在第一次被使用时,才会被 Java 虚拟机加载并初始化,所以它也是线程安全的,且是懒加载的,它的实现代码如下:

点击查看代码
public enum  EnumSingleton4 {
    INSTANCE;
    public EnumSingleton4 getInstance(){
        return INSTANCE;
    }
}
posted @   愚昧小生  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示