Java单例模式回顾

简单回顾下Java各类单例模式的写法

饿汉式

java 复制代码
public class SingleClass{
    private  static final SingleClass INSTANCE = new SingleClass();
    private SingleClass(){

    }
    public SingleClass getSingle(){
        return INSTANCE;
    }

}

这样在启动时就会创建一个实例,不论是否需要,默认就会创建,因此叫做饿汉式,但这样会浪费内存

懒汉式

java 复制代码
public class SingleClass{
    private  static SingleClass instance;
    private SingleClass(){

    }
    public SingleClass getSingle(){
        if (instance==null){
            instance = new SingleClass();
        }
        return instance;
    }

} 

这样在调用时才会创建一个实例,如果不需要,就不会浪费内存了,因此叫做懒汉式

线程安全双重锁校验

java 复制代码
public class SingleClass{
    private  static SingleClass instance;
    private SingleClass(){

    }
    public SingleClass getSingle(){
        if (instance==null){
            synchronized (SingleClass.class) {      // 加锁 锁的对象是类对象,其它的线程会等待锁
                if (instance==null){
                    instance = new SingleClass();
                }
            }
        }
        return instance;
    }

}

这样在调用时才会创建一个实例,若不需要,就不会浪费内存了,这里采用synchronized关键字,锁住整个class对象,线程安全

静态内部类

java 复制代码
public class SingleClass{
    private SingleClass(){

    }
    //静态内部类 一开始不会加载
    public static class Holder{
        private  static final SingleClass INSTANCE = new SingleClass();
    }
    //调用方法了才会加载
    public static getSingle(){
        return Holder.INSTANCE;
    }


}

静态内部类 一开始不会加载,调用方法了才会加载,不会浪费内存,多个线程安全

枚举

java 复制代码
public enum SingleClass {
    // 编译器帮你创建:INSTANCE 就是实例
    INSTANCE;

    // 编译器帮你生成私有构造方法
    // 构造方法
    SingleClass() {
    }
}

原理:枚举只有这里在编译器内部实现相当于 public static final SingleClass INSTANCE = new SingleClass(); 这里创建了一个静态final实例,类加载时就会创建一个实例,线程安全

禁止反射创建多个实例原理:

java 复制代码
// java.lang.reflect.Constructor 的 newInstance 方法源码:
public T newInstance(Object ... initargs) {
    // 关键!如果是枚举,直接抛异常!
    if ((clazz.getModifiers() & Modifier.ENUM) != 0) {
        throw new IllegalArgumentException("Cannot reflectively create enum objects");
    }
}
相关推荐
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地11 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
莫逸风13 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898614 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112314 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员15 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风336615 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李15 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
张小姐的猫16 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
前端双越老师17 小时前
如何以前端视角(非0基础)学 Java ?
java·node.js·全栈