【设计模式】单例模式的7种实现方法

一、饿汉式-线程安全

线程安全,但无法实现实例懒加载策略

java 复制代码
/**
 * 饿汉式
 * @author CC
 * @version 1.0
 * @since2023/10/12
 */
public class Singleton {
    private static final Singleton singleton = new Singleton();

    private Singleton() {
    }

    public static Singleton getSingleton() {
        return singleton;
    }
}

二、懒汉式-线程不安全

线程不安全,实现了实例懒加载策略。

java 复制代码
/**
 * 懒汉式
 * @author CC
 * @version 1.0
 * @since2023/10/12
 */
public class Singleton2 {
    private static Singleton2 singleton = null;

    private Singleton2() {
    }

    public static Singleton2 getSingleton() {
        if (singleton == null) {
            singleton = new Singleton2();
        }
        return singleton;
    }
}

三、全局锁式-线程安全

线程安全,实现了懒加载策略,但是线程同步效率不高。

java 复制代码
/**
 * 全局锁
 * @author CC
 * @version 1.0
 * @since2023/10/12
 */
public class Singleton3 {
    private static Singleton3 singleton;

    private Singleton3() {
    }

    public synchronized static Singleton3 getSingleton() {
        if (singleton == null) {
            singleton = new Singleton3();
        }
        return singleton;
    }
}

四、静态代码块式-线程安全

线程安全,类加载时初始化实例,实现了懒加载策略,线程安全。

java 复制代码
/**
 * 静态代码块
 * @author CC
 * @version 1.0
 * @since2023/10/12
 */
public class Singleton4 {
    private final static Singleton4 singleton;

    private Singleton4() {
    }

    static {
        singleton = new Singleton4();
    }

    public static Singleton4 getSingleton() {
        return singleton;
    }
}

五、双重校验锁式-线程安全

线程安全,且实现了懒加载策略,同时保证了线程同步时的效率。

java 复制代码
/**
 * 双重校验锁
 * @author CC
 * @version 1.0
 * @since2023/10/12
 */
public class Singleton5 {
    private  static Singleton5 singleton;

    private Singleton5() {

    }

    public static Singleton5 getSingleton() {
        if (singleton == null) {
            synchronized (Singleton5.class) {
                if (singleton == null) {
                    singleton = new Singleton5();
                }
            }
        }
        return singleton;
    }
}

六、内部类-线程安全

线程安全,不存在线程同步问题,单例对象在程序第一次调用getInstance()时主动加载 SingletonHolder和其 静态成员INSTANCE,因而实现了懒加载策略。推荐使用。

java 复制代码
/**
 * 内部类
 * @author CC
 * @version 1.0
 * @since2023/10/12
 */
public class Singleton6 {
    private Singleton6() {
    }

    private static class Singleton6Holder {
        private static final Singleton6 INSTANCE  = new Singleton6();
    }

    public static Singleton6 getSingleton() {
        return Singleton6Holder.INSTANCE ;
    }
}

七、枚举类-线程安全

线程安全,不存在线程同步问题,且单例对象在枚举类型 INSTANCE第一次引用时通过枚举的 构造函数初始化,从而实现了懒加载策略。推荐使用。

java 复制代码
/**
 * 枚举类
 * @author CC
 * @version 1.0
 * @since2023/10/12
 */
public class Singleton7 {
    private Singleton7() {
    }

    enum SingletonEnum {
        INSTANCE;

        private final Singleton7 singleton;

        private SingletonEnum() {
            singleton = new Singleton7();
        }
    }

    public static Singleton7 getSingleton() {
        return SingletonEnum.INSTANCE.singleton;
    }
}
相关推荐
一嘴一个橘子3 分钟前
java 中使用 lua 脚本
java
码智社12 分钟前
Spring Framework 全方位技术解析
java
wangqiaowq27 分钟前
AST 安全求值
java·开发语言
Java_2017_csdn1 小时前
OFC、ERP、OMS、WMS、TMS 对比-详解
java
EatFan9 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
Maiko Star10 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
现任明教教主~11 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
一条破秋裤12 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
布吉岛的石头12 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
摇滚侠13 小时前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python