java中的单例模式

Java实现单例模式的几种方式:

1. 饿汉式(推荐,线程安全)

复制代码
public class Singleton {
    // 类加载时就初始化
    private static final Singleton INSTANCE = new Singleton();
    
    // 私有构造
    private Singleton() {
        // 防止反射攻击
        if (INSTANCE != null) {
            throw new RuntimeException("单例模式禁止反射创建");
        }
    }
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2. 静态内部类(推荐,懒加载)

复制代码
public class Singleton {
    private Singleton() {
        // 防止反射攻击
        if (InnerHolder.INSTANCE != null) {
            throw new RuntimeException("单例模式禁止反射创建");
        }
    }
    
    // 静态内部类
    private static class InnerHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    public static Singleton getInstance() {
        return InnerHolder.INSTANCE;
    }
}
  • 懒加载:只有调用getInstance()时才加载内部类

  • 线程安全:JVM保证类加载的线程安全

3. 双重检查锁(懒加载,线程安全)

复制代码
public class Singleton {
    // 必须加volatile,禁止指令重排序
    private static volatile Singleton instance;
    
    private Singleton() {
        // 防止反射攻击
        if (instance != null) {
            throw new RuntimeException("单例模式禁止反射创建");
        }
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
相关推荐
宵时待雨2 分钟前
C++笔记归纳20:智能指针
开发语言·c++·笔记
EvenBoy2 分钟前
IDEA中使用Claude Code
java·ide·intellij-idea
jinanwuhuaguo2 分钟前
OpenClaw 2026.4.5 深度解读
android·开发语言·人工智能·kotlin·openclaw
小小马喽_Thendras9 分钟前
ScheduledExecutorService 和Timer的区别
java·开发语言
小江的记录本16 分钟前
【Swagger】Swagger系统性知识体系全方位结构化总结
java·前端·后端·python·mysql·spring·docker
空太Jun17 分钟前
Spring Security 自定义数据库认证(初尝试)
java·数据库·spring
报错小能手18 分钟前
ios开发方向——swift内存基础
开发语言·ios·swift
minji...18 分钟前
Linux 多线程(四)线程等待,线程分离,线程管理,C++多线程,pthread库
linux·运维·开发语言·网络·c++·算法
麦德泽特21 分钟前
基于 Go 语言的 Modbus 项目实战:构建高性能、可扩展的工业通信服务器
服务器·开发语言·golang·modbus·rtu
sinat_2554878125 分钟前
泛型·学习笔记
java·jvm·数据库·windows·python